Kafka의 기본 개념과 용어 정리

Apache Kafka는 대규모 데이터 스트리밍 시스템으로, 실시간으로 데이터를 처리하고 전달하는 데 매우 효과적인 분산형 플랫폼입니다. Kafka는 메시지 큐 시스템으로 시작되었지만, 현재는 데이터 파이프라인, 로그 수집 시스템, 실시간 분석 및 모니터링 등 다양한 용도로 사용됩니다. Kafka의 기본적인 개념과 용어는 시스템의 작동 방식과 이해를 돕기 위해 매우 중요합니다. 여기에 Node.js와의 연관성도 함께 살펴보겠습니다.
1. Producer (생산자)
Producer는 Kafka에 데이터를 생성하여 전송하는 역할을 합니다. 애플리케이션에서 발생하는 이벤트나 로그 메시지, 트랜잭션 데이터 등을 Kafka로 전송하는 시스템을 의미합니다. Producer는 데이터를 특정 Topic에 보냅니다.
- 예시: 사용자가 웹 애플리케이션에서 버튼을 클릭하거나, 특정 이벤트를 발생시키는 경우, 해당 이벤트는 Producer가 되어 Kafka로 전송됩니다.
Node.js와 연관: Node.js는 비동기적이고 이벤트 기반의 특성을 가진 언어입니다. Node.js를 사용하면 비동기 방식으로 Kafka의 Producer로 데이터를 전송하는 시스템을 손쉽게 구현할 수 있습니다. 예를 들어, kafkajs
라는 라이브러리를 사용하여 Node.js 애플리케이션에서 Kafka의 Producer 역할을 할 수 있습니다.
const kafka = new Kafka({
clientId: my-app,
brokers: [localhost:9092]
});
const producer = kafka.producer();
const run = async () => {
await producer.connect();
await producer.send({
topic: my-topic,
messages: [
{ value: Hello Kafka },
],
});
await producer.disconnect();
}
run().catch(console.error);
2. Consumer (소비자)
Consumer는 Kafka에서 데이터를 소비하는 역할을 합니다. 즉, Producer가 전송한 데이터를 Kafka로부터 읽어들여 처리하는 시스템입니다. Consumer는 데이터를 읽어오는 방식에 따라 다양한 소비 모델을 지원합니다. 예를 들어, 하나의 Consumer 그룹이 여러 개의 Consumer를 포함하여, 데이터를 병렬로 처리할 수 있습니다.
- 예시: 웹 애플리케이션에서 발생한 사용자의 클릭 데이터를 처리하는 시스템이 Kafka에서 데이터를 읽어와서 그 결과를 분석하거나, 다른 시스템에 전달하는 역할을 합니다.
Node.js와 연관: Node.js에서는 kafkajs
나 node-rdkafka
라이브러리를 이용해 Kafka Consumer를 구현할 수 있습니다. Node.js를 사용하여 Kafka에서 실시간으로 데이터를 읽고 처리하는 시스템을 구축할 수 있습니다.
const kafka = new Kafka({
clientId: my-app,
brokers: [localhost:9092]
});
const consumer = kafka.consumer({ groupId: test-group });
const run = async () => {
await consumer.connect();
await consumer.subscribe({ topic: my-topic, fromBeginning: true });
await consumer.run({
eachMessage: async ({ topic, partition, message }) => {
console.log({
value: message.value.toString(),
});
},
});
}
run().catch(console.error);
3. Broker
Broker는 Kafka 클러스터에서 데이터를 관리하고 전달하는 서버입니다. Kafka에서는 여러 개의 Broker가 클러스터를 형성하여 동작합니다. 각 Broker는 데이터를 Partition으로 나누어 저장하고, Producer와 Consumer 간의 메시지를 중계하는 역할을 합니다.
- 예시: Kafka 클러스터는 여러 서버에 걸쳐 분산되어 있으며, 각 서버는 하나의 Broker 역할을 하여 데이터를 저장하고 요청을 처리합니다.
Node.js와 연관: Node.js 애플리케이션은 클러스터의 하나 이상의 Broker에 접근하여 Kafka와 연결됩니다. 이때, kafkajs
라이브러리를 사용하면 여러 Broker에 분산된 데이터를 읽거나 쓸 수 있습니다.
4. Topic
Topic은 Kafka에서 데이터를 논리적으로 구분하는 단위입니다. 데이터를 Producer에서 보내고, Consumer에서 읽는 단위가 Topic입니다. 예를 들어, order-events, user-clicks와 같은 다양한 Topic을 정의하여 각기 다른 데이터를 처리할 수 있습니다.
- 예시: 웹사이트에서 사용자 클릭 데이터를 보내는 Topic은 user-clicks일 수 있고, 결제 처리 데이터를 보내는 Topic은 order-events일 수 있습니다.
Node.js와 연관: Node.js 애플리케이션에서 Kafka로 데이터를 전송할 때는 특정 Topic을 지정하여 메시지를 보냅니다. 이와 마찬가지로, Consumer는 특정 Topic에서 데이터를 읽을 수 있습니다.
const producer = kafka.producer();
await producer.send({
topic: user-clicks,
messages: [
{ value: User clicked on button },
],
});
5. Partition
Partition은 Kafka Topic 내에서 데이터를 물리적으로 분할하는 단위입니다. 각 Partition은 독립적인 로그를 가지고 있으며, 데이터를 순차적으로 기록합니다. Partition을 통해 Kafka는 데이터를 분산 처리하고, 높은 성능을 제공할 수 있습니다.
- 예시: user-clicks Topic이 여러 개의 Partition으로 나뉘면, 각 Partition은 다른 서버에 저장되고 여러 Consumer가 병렬로 데이터를 처리할 수 있습니다.
6. Offset
Offset은 Kafka에서 각 메시지에 부여되는 고유한 식별자입니다. 각 메시지는 Partition 내에서 순차적으로 기록되며, Consumer는 이 Offset을 기준으로 데이터를 읽습니다.
- 예시: Consumer가 Kafka에서 데이터를 읽을 때, 읽은 메시지의 Offset을 기록하여 이후 데이터를 다시 읽을 때 이전에 읽은 데이터를 건너뛰거나 다시 읽을 수 있습니다.
7. Consumer Group (소비자 그룹)
Consumer Group은 여러 Consumer가 동일한 Topic을 읽을 때, 각 Consumer가 서로 다른 Partition을 읽어 처리하도록 하는 방식입니다. 동일한 Consumer Group에 속한 Consumer는 동일한 데이터를 처리하지 않으며, 각 Consumer는 서로 다른 Partition을 담당하게 됩니다.
- 예시: user-clicks Topic을 처리하는 Consumer Group에 여러 Consumer가 포함되면, 각 Consumer는 Topic의 다른 Partition에서 데이터를 읽고 처리합니다.
8. Replication (복제)
Kafka는 데이터의 복제 기능을 제공합니다. 각 Partition은 여러 개의 Replica를 가질 수 있으며, 이는 장애 발생 시 데이터 손실을 방지하고 가용성을 높이는 역할을 합니다.
- 예시: user-clicks Topic의 Partition이 두 개의 Replica를 가질 경우, 하나의 서버가 다운되더라도 다른 서버에서 데이터를 계속 사용할 수 있습니다.
9. Kafka와 Node.js 연동
Node.js는 비동기적이고 이벤트 기반 아키텍처를 갖고 있기 때문에 Kafka와의 연동에서 큰 장점이 있습니다. kafkajs
라이브러리는 Node.js에서 Kafka의 Producer와 Consumer를 쉽게 구현할 수 있게 해주며, 대규모 데이터를 처리할 수 있는 강력한 도구입니다. Node.js를 통해 Kafka와 통합하면 실시간 데이터 처리와 스트리밍 시스템을 구축할 수 있습니다.
결론
Apache Kafka는 대규모 데이터 처리와 실시간 스트리밍 시스템에 최적화된 분산형 플랫폼입니다. Kafka의 기본 개념과 용어를 이해하면, 이를 효과적으로 활용하여 대용량 데이터를 처리하고 실시간 이벤트를 관리하는 시스템을 구축할 수 있습니다. Node.js와 Kafka를 연동하면, 비동기적이고 고성능의 실시간 데이터 처리 애플리케이션을 구축할 수 있습니다.