--- title: "Real time communication of microservices with Apache Kafka" disqus: JBeanny --- By: Yim Sotharoth Real time communication of Nodejs Application with Kafkajs <img src="https://kafka.js.org/img/kafkajs_circle.png" alt="kafka-png" width="30" /> === ## Table of Contents [TOC] ## Installation _I create 2 folders one is called `kafka-producer` and another one is called `kafka-consumer` after that I go inside each of the 2 folders and do the following:_ :::info _firstly create a node project_ ```bash= $ npm init --y ``` _I named folder as `kafkajs` ( or anything you want ) so I cd in my folder_ > In `kafkajs` folder install a few libraries with the following command ```bash= $ npm install kafkajs ``` ::: :::warning Before Getting started, make sure you have the kafka server up and running. If not, then you can go the our repository to grab the `docker-compose.yaml` file and then run the following command: ```bash! docker compose up -d ``` [Project Repository](#Demo1) ::: ## First we are going to build the message sender service (Producer) ### kafka producer #### Producer configuration _I create `kafka-config` folder in `kafka-producer` service and then create a `producer.js` file with following code_: ```javascript! const { Kafka } = require("kafkajs"); const clientId = "nodejs-kafka-metaphorlism"; // kafka broker const brokers = ["localhost:9092"]; // define topic name const topic = "messages-topic"; const kafka = new Kafka({ clientId, brokers }); const producer = kafka.producer(); const produce = async () => { await producer.connect(); let i = 0; // send a message to a kafka topic every 1000ms(1s) setInterval(async () => { try { await producer.send({ topic, messages: [ { key: String(i), value: "Hello from Metaphorlism: " + i, }, ], }); console.log("message produced: ", i); i++; } catch (err) { console.error("error: " + err); } }, 1000); }; module.exports = produce; ``` _After done creating producer configuration, I create a `index.js` file within the main directory of `kafka-producer` folder with the following code in order to invoke the producer to use:_ ```javascript! const produce = require("./kafka-config/producer"); produce().catch((err) => { console.error("Producer error: ", err); }); ``` ***after implementing all of this , you will be able to send the message to the `messages-topic` topic. But we want another service to work as a message consumer from the `messages-topic` and that service is going to be named as `kafka-consumer`*** ## Now we are going to build the message receiver service ### kafka consumer #### consumer configuration _I create `kafka-config` folder in `kafka-consumer` service and then create a `consumer.js` file with following code_: ```javascript! const { Kafka } = require("kafkajs"); const clientId = "nodejs-kafka-metaphorlism"; // kafka broker const brokers = ["localhost:9092"]; // define topic name const topic = "messages-topic"; const kafka = new Kafka({ clientId, brokers }); const consumer = kafka.consumer({ groupId: clientId }); // listening to events of messages-topic const consume = async () => { await consumer.connect(); await consumer.subscribe({ topic }); await consumer.run({ eachMessage: ({ message }) => { console.log(`message received : ${message.value}`); }, }); }; module.exports = consume; ``` _After done creating producer configuration, I create a `index.js` file within the main directory of `kafka-consumer` folder with the following code in order to invoke the producer to use:_ ```javascript! const consume = require("./kafka-config/consumer"); consume().catch((err) => { console.error("Consumer error: ", err); }); ``` :::success After implementing both of the services, we will be able to see the magic of KafkaJS with NodeJS 😉😉 ::: Project Repository: https://github.com/metaphorlism/nodejs-with-kafkajs ## Contact Us - :mailbox: yimsotharoth999@gmail.com - [GitHub](https://github.com/metaphorlism) - [Facebook Page](https://www.facebook.com/Metaphorlism) - [Instagram: Metaphorlism](https://www.instagram.com/metaphorlism/)