JavaScript와 Kafka를 활용한 실시간 사용자 이벤트 스트리밍 시스템 구축 경험 — 5개월간의 도전과 65% 응답 속도 향상 사례 분석
긴 글, 핵심만 먼저 — 이 글을 3줄로 정리해드려요.
실시간 사용자 이벤트 스트리밍 시스템 구축은 많은 기업들이 필요로 하는 기능이다. 특히, 사용자 행동을 신속하게 분석하고 대응하기 위해서는 효율적인 데이터 처리 시스템이 필수적이다. 본 글에서는 JavaScript와 Kafka를 활용하여 실시간 이벤트 스트리밍 시스템을 구축한 경험을 공유하고, 이 과정에서의 도전과 트레이드오프를 다루고자 한다.
시스템 아키텍처 설계
시스템을 설계할 때 가장 먼저 고려해야 했던 것은 아키텍처의 확장성과 유연성이었다. Kafka는 높은 처리량을 자랑하지만, 이를 효과적으로 활용하기 위해서는 적절한 프로듀서와 컨슈머 설계가 필요하다. JavaScript를 주 언어로 선택한 이유는 프론트엔드와의 통합이 용이하고, 비동기 처리에 강점이 있기 때문이다.
예를 들어, 이벤트 프로듀서는 다음과 같이 구현했다.
const { Kafka } = require('kafkajs');
const kafka = new Kafka({
clientId: 'user-events',
brokers: ['localhost:9092']
});
const producer = kafka.producer();
const sendEvent = async (event) => {
await producer.send({
topic: 'user-events',
messages: [{ value: JSON.stringify(event) }],
});
};
// 이벤트 발생 시 호출
sendEvent({ userId: 1, action: 'click', timestamp: Date.now() });
이 코드에서는 Kafka 프로듀서를 생성하고, 특정 이벤트를 Kafka에 전송하는 과정을 보여준다. 그러나 여기서 주의해야 할 점은 메시지 전송의 비동기성으로 인해 이벤트 손실 가능성이 있다는 것이다. 그래서 메시지 전송 후 확인 절차를 추가하는 것이 좋다.
성능 최적화와 트레이드오프
시스템 성능을 최적화하는 과정에서 여러 가지 트레이드오프를 감수해야 했다. 예를 들어, 데이터의 일관성을 유지하기 위해 메시지의 ACK 설정을 조정했다. 기본적으로 'all'로 설정하면 모든 브로커에서 메시지를 확인해야 하므로 지연 시간이 늘어날 수 있다. 반대로 '1'로 설정하면 성능은 향상되지만 데이터 손실 위험이 커진다.
이러한 설정을 통해 65%의 응답 속도 향상을 이끌어낼 수 있었지만, 이 과정에서 데이터 유실 가능성을 항상 염두에 두어야 했다. 따라서, 데이터의 중요도에 따라 ACK 설정을 동적으로 조정하는 방안을 고려할 필요가 있었다.