-2

I am using kafka-node module in my NodeJs Microservise project. Here I want a Pub/Sub (publisher and subscriber) design pattern in Functional programming paradigm.

producer.js

  const client = new kafka.KafkaClient({
    kafkaHost: process.env.KAFKA_BOOTSTRAP_SERVERS,
  });
  const producer = new kafka.Producer(client);

  producer.on("ready", () => {
    producer.createTopics(
      ["topic1", "topic2", "topic3"],
      true,
      console.log,
    );
  ...
  ...
  producer.send(
      [
        {
          topic: "topic1",
          messages: JSON.stringify(req.body),
        },
      ],
      console.log,
    );

consumer.js

  const client = new kafka.KafkaClient({
    kafkaHost: process.env.KAFKA_BOOTSTRAP_SERVERS,
  });
  console.log(client);
  const consumer = new kafka.Consumer(
    client,
    [{ topic: "topic1" }],
    {
      autoCommit: false,
    },
  );

  consumer.on("message", (message) => {
    doSomeAction(JSON.parse(message.value));
  });

  consumer.on("error", (err) => {
    console.log(err);
  });

Expectation

A Function Programming module named like -KafkaLib

const kafkaLib = KafkaLib({kafkaHost: process.env.KAFKA_BOOTSTRAP_SERVERS});
...
...
kafkaLib.publish("topic1", req.body);
...
...
kafkaLib.subscribe("topic1", (data)=>{
   doSomeAction(data.value);
});

1 Answers1

0

Your question isn't really related to Kafka. JS functions are top-level objects, so this

producer.on("ready", () => {
    producer.createTopics(
      ["topic1", "topic2", "topic3"],
      true,
      console.log,
    );
});

Could be re-written as

const onReady = () => {
    producer.createTopics(
      ["topic1", "topic2", "topic3"],
      true,
      console.log,
    );
};

producer.on("ready", onReady);

But, it's not clear what that helps you with. This is no more scalable than the first version.

NestJS is more functional with classes and event-handlers.

OneCricketeer
  • 179,855
  • 19
  • 132
  • 245