Hi

Kafka를 nodejs로 10분만에 실행하기 본문

Programming

Kafka를 nodejs로 10분만에 실행하기

SharingWorld 2022. 6. 11. 04:36

Kafka는 A라는 컴퓨터가 이벤트를 만들면 B라는 컴퓨터가 그 이벤트를 처리하는 기술입니다.

다시 말해 A 컴퓨터는 Event Producer이며, B 컴퓨터는 Event Consumer이고 비동기적으로 서로 다른 컴퓨터끼리 이벤트를 만들고 처리하는 기술이죠.

 

Kafka를 node.js 언어로 함께 구성해보도록 하겠습니다.

 

1. JDK(Java Development Kit)를 설치합니다. (JDK 설치 링크)

Linux Ubuntu 운영체제라면 아래 명령어로 설치하세요~

sudo apt-get install default-jdk

 

2. Kafka를 설치합니다.

curl -Ol https://dlcdn.apache.org/kafka/3.2.0/kafka_2.13-3.2.0.tgz

현재 포스트 시점보다 새 버전을 설치하고 싶으시면 Kafka Quickstart 문서를 참조하시라~

 

 

 

3. Kafka 압축 파일을 풀고 해당 디렉토리에 접근하세요.

tar -zxvf kafka_2.13-3.2.0.tgz && cd kafka_2.13-3.2.0

 

 

 

4. Kafka ZooKeeper와 Broker를 실행합니다.

Kafka를 실행하려면 두 개의 process를 실행해야 하는데요.

하나는 producer와 consumer를 중개하는 "Broker", 다른 하나는 여러 Broker들을 관리하는 "Zookeeper" 입니다.

 

4.1. 먼저 Kafka ZooKeeper를 실행합니다.

bin/zookeeper-server-start.sh config/zookeeper.properties

 

4.2. Kafka Broker를 실행합니다.

bin/kafka-server-start.sh config/server.properties

 

 

5. Kafka Topic을 실행합니다.

Topic은 하나의 이벤트를 분류한 것인데요.

데이터베이스를 예로들면 MongoDB의 Collection, MySQL의 Table과 유사한 개념이 Topic이라고 볼 수 있습니다.

여기서는 Topic 이름을 helloworld-events로 하겠습니다.

bin/kafka-topics.sh --create --topic helloworld-events --bootstrap-server localhost:9092

 

 

6. nodejs용 kafka 라이브러리들 중 하나인 KafkaJS를 설치합니다.

npm install kafkajs --save

 

7. 이벤트를 수신하고 싶은 곳에 다음 Consumer 코드를 넣고 해당 process를 실행합니다.

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

run().then(() => console.log("Done"), err => console.log(err));

async function run() {
  const kafka = new Kafka({ brokers: ["localhost:9092"] });
  
  const consumer = kafka.consumer({ groupId: "consumerGroupId1" });
  await consumer.connect();
  await consumer.subscribe({ topic: "helloworld-events" });
  
  await consumer.run({ 
    eachMessage: async (data) => {
      console.log(data.message.value.toString('utf8'));
    }
  });
}

 

 

8. 이벤트를 보내고 싶은 곳에 Producer 코드를 넣고 해당 process를 실행합니다.

8.1. Producer 설정 코드를 넣습니다.

const producer = kafka.producer();
await this.producer.connect();

function async produceEvent(producer) {
  await producer.send({
    topic: 'quickstart-events',
    messages: [
      { value: 'new event', timestamp: new Date().getTime().toString() },
    ],
  });
}

 

8.2. 원하는 시점에서 아래와 같이 이벤트를 발생시킵니다.

await this.producer.send({
  topic: 'helloword-events',
  messages: [
    { value: 'helloworld event 1', timestamp: new Date().getTime().toString() },
  ],
});

 

 

9. Producer에서 이벤트를 발생시킬 때마다 Consumer에서 이벤트를 수신하는 결과를 확인합니다.

 

 

 

 

 

좀 더 구체적으로 알고 싶으시다구요?

제가 참고한 아래 영문 포스트를 읽어보셔도 좋습니다~

'Programming' 카테고리의 다른 글

앱 모니터링 서비스 "Sentry"  (0) 2022.08.15
환경 변수  (0) 2018.07.29
셸(Shell)  (0) 2018.07.29
vi 전체삭제  (0) 2018.06.30
CDN(Content Delivery Network)  (0) 2018.06.22