Windows 환경 Kafka 설치와 KafkaJS 간단 예제

2021-04-02

Kafka 설치

  1. Kafka download 검색 혹은 카프카 설치 페이지 방문
  2. Windows 환경 기준 Binary downloads에 있는 파일 다운로드
    • 예시) Scala 2.12 - kafka_2.12-2.8.0.tgz (asc, sha512)
  3. 다운로드 완료 후 특정 드라이브 아래에 바로 위치하도록 수정, 디렉토리 명이 길어지면 gradlew jar all 오류가 발생하기 때문
    • 예시) C:\kafka

Kafka 실행 및 topic 생성

  1. {Kafka 디렉토리}\bin\windows로 이동하여 .\zookeeper-server-start.bat ..\..\config\zookeeper.propertieszookeeper를 실행한다.
  2. {Kafka 디렉토리}\bin\windows에서 .\kafka-server-start.bat ..\..\config\server.propertieskafka를 실행한다.
  3. .\kafka-topics.bat --bootstrap-server localhost:9092 --create --topic test-topic --partitions 1 --replication-factor 1 명령어를 사용하여 test-topic이라는 이름으로 topic을 생성한다.
    • topic을 알맞게 생성하지 않을시 추후에 <<[BrokerPool] Failed to connect to seed broker, trying another broker from the list>> 에러를 만나게 된다.

KafkaJS 설치

KafkaJS

npm install kafkajs

Node.js 프로젝트에서 위 명령어로 KafkaJS를 설치한다.

Producer, Consumer 작성

kafka.js과 같은 이름으로 파일을 하나 생성 후 아래 코드를 작성한다.

const { Kafka } = require("kafkajs");

const kafka = new Kafka({
  clientId: "my-app",
  brokers: ["localhost:9092"],
});

const producer = kafka.producer();
const consumer = kafka.consumer({ groupId: "test-group" });

const run = async () => {
  // Producing
  await producer.connect();
  await producer.send({
    topic: "test-topic",
    messages: [{ value: "Hello KafkaJS user!" }],
  });

  // Consuming
  await consumer.connect();
  await consumer.subscribe({ topic: "test-topic", fromBeginning: true });

  await consumer.run({
    eachMessage: async ({ topic, partition, message }) => {
      console.log({
        partition,
        offset: message.offset,
        value: message.value.toString(),
      });
    },
  });
};

run().catch(console.error);

이후 콘솔에서 node kafka.js 명령어로 실행하면 아래와 비슷한 결과를 만날 수 있다.

{"level":"INFO","timestamp":"2021-03-31T09:01:45.280Z","logger":"kafkajs","message":"[Consumer] Starting","groupId":"test-group"}
{"level":"INFO","timestamp":"2021-03-31T09:01:45.312Z","logger":"kafkajs","message":"[ConsumerGroup] Consumer has joined the group","groupId":"test-group","memberId":"my-app-cac1e6c7-9757-43e4-aa1b-3e71a53b738c","leaderId":"my-app-cac1e6c7-9757-43e4-aa1b-3e71a53b738c","isLeader":true,"memberAssignment":{"test-topic":[0]},"groupProtocol":"RoundRobinAssigner","duration":29}
{ partition: 0, offset: '1', value: 'Hello KafkaJS user!' }
{ partition: 0, offset: '2', value: 'Hello KafkaJS user!' }