Node.js · 2026-03-02

Kafka와 Node.js로 스트리밍 파이프라인 구축

Kafka와 Node.js를 연결해 스트리밍 데이터 파이프라인을 설계하고 kafka-node 사용법을 단계별 예제와 운영 고려사항 중심으로 설명하는 예제

작성일 : 2026-03-02 ㆍ 작성자 : 관리자
post
목차

소개

스트리밍 데이터는 실시간 분석과 이벤트 드리븐 아키텍처의 핵심이다. Kafka는 높은 처리량과 내구성을 제공한다. Node.js는 비동기 I/O와 풍부한 생태계를 바탕으로 스트리밍 파이프라인의 경량 컴포넌트로 자주 사용된다. 이 글에서는 Node.js Kafka 연동 예제와 kafka-node 사용법을 중심으로 기본 설계부터 코드 예제, 운영 고려사항까지 다룬다.

아키텍처 개요

구성 요소

간단한 스트리밍 파이프라인은 다음 구성 요소로 이루어진다.

  • 프로듀서: 이벤트를 Kafka 토픽으로 전송
  • Kafka 브로커: 메시지 저장 및 분배
  • 컨슈머: 토픽에서 메시지를 읽어 처리
  • 처리 서비스: 비즈니스 로직, 보조 저장소 또는 스트림 처리

데이터 흐름

프로듀서가 이벤트를 보낸다. Kafka는 이를 토픽에 저장하고 파티셔닝한다. 컨슈머 그룹은 병렬로 메시지를 읽어 처리한다. 장애가 발생하면 Kafka의 내구성으로 재처리가 가능하다.

사전 준비

필수 설치

로컬이나 클러스터에 Kafka 브로커가 실행되어야 한다. 간단 테스트 용도라면 Zookeeper와 Kafka를 로컬에서 실행하면 된다. Node.js 환경은 LTS 권장 버전 사용을 권장한다.

프로젝트 초기화

프로젝트를 만들고 kafka-node를 설치한다.

npm init -y
npm install kafka-node

kafka-node 사용법 예제

아래 예제는 간단한 프로듀서와 컨슈머다. 실무에서는 오류 처리, 재시도, 직렬화, 스키마 관리 등을 추가해야 한다.

프로듀서 예제

const kafka = require('kafka-node');
const client = new kafka.KafkaClient({ kafkaHost: 'localhost:9092' });
const producer = new kafka.Producer(client);

producer.on('ready', () => {
  const payloads = [
    { topic: 'events', messages: JSON.stringify({ id: 1, type: 'click', ts: Date.now() }) }
  ];
  producer.send(payloads, (err, data) => {
    if (err) console.error('Send error', err);
    else console.log('Send success', data);
    // 필요 시 프로세스 유지 또는 종료 처리
  });
});

producer.on('error', (err) => {
  console.error('Producer error', err);
});

컨슈머 예제

const kafka = require('kafka-node');
const client = new kafka.KafkaClient({ kafkaHost: 'localhost:9092' });
const consumer = new kafka.Consumer(
  client,
  [ { topic: 'events', partition: 0 } ],
  { autoCommit: true }
);

consumer.on('message', (message) => {
  try {
    const payload = JSON.parse(message.value || message.payload || message);
    console.log('Received', payload);
    // 비즈니스 처리 로직 호출
  } catch (err) {
    console.error('Parse error', err);
  }
});

consumer.on('error', (err) => {
  console.error('Consumer error', err);
});

핵심 구현 포인트

  • 직렬화: JSON 대신 Avro나 Protobuf 사용으로 메시지 크기와 호환성 개선
  • 파트셔닝 전략: 키 기반 파티셔닝으로 메시지 순서 보장
  • 오류 처리: 재시도 정책과 DLQ(데드 레터 큐) 설계
  • 스케일링: 컨슈머 그룹으로 수평 확장

운영 고려사항

모니터링

브로커 지표, 토픽 랙, 컨슈머 지연 시간을 지속적으로 모니터링한다. Prometheus와 Grafana 조합이 흔히 사용된다.

로깅과 추적

메시지 ID와 트레이스 ID를 포함해 로그와 분산 추적을 연계한다. 문제 원인 파악과 재처리에 도움이 된다.

보안

SASL/SSL 설정으로 통신을 암호화하고 인증을 적용한다. 운영 환경에서는 인증과 권한 관리를 반드시 설정한다.

확장 예시와 권장 패턴

  • 비동기 처리는 백프레셔(backpressure)를 고려해 큐를 두고 처리
  • 초당 높은 쓰기량은 배치 전송을 사용해 효율 개선
  • 스키마 레지스트리 도입으로 프로듀서와 컨슈머 간 스키마 호환성 보장

마무리

이 글은 Node.js Kafka 연동 예제와 kafka-node 사용법을 중심으로 스트리밍 파이프라인의 기본을 설명했다. 실제 서비스에는 모니터링, 보안, 데이터 계약 관리가 필수다. 먼저 작은 프로토타입을 만들어 흐름을 검증한 뒤 운영 요구에 맞춰 확장하는 접근을 권장한다.

Node.js Kafka 연동 예제 kafka-node 사용법 스트리밍 파이프라인 Node.js Kafka Node.js 스트리밍 데이터 메시지 큐 실시간 처리