繁体   English   中英

具有pm2集群的Nodejs Kafka使用者

[英]Nodejs Kafka consumer with pm2 cluster

我已经实现了Kafka消费者应用程序,我只是想知道是否以pm2集群模式运行此应用程序,所有内核会消耗相同的消息还是不同的消息? 有什么办法可以验证吗? 在集群模式下运行此应用程序是否理想? 之所以我在集群模式下运行它,是因为我们的kafka会产生大量消息。

同样目前,如果我在pm2集群模式下运行此程序,那么我们所有的内核都将达到CPU使用率的100%。 是否应该这样发生?

仅供参考:我正在使用https://www.npmjs.com/package/no-kafka

所有内核将消耗相同的消息还是不同的消息? 有什么办法可以验证吗?

这取决于您的主题配置+使用者配置。 让我们举个例子。

  • 假设我们有一个包含3个分区的主题。
  • 现在,我们以消费者组为“ some_consumer_group”开始1个消费者进程。 有关消费群体的详细信息,请参见https://www.npmjs.com/package/no-kafka#groupconsumer-new-unified-consumer-api
  • 现在,您的一位消费者正在收听3个分区。
  • 由于kafka会针对每个主题维护偏移量,因此对于每个消费者组的每个分区,您的消费者将从3个不同的分区接收3条消息。 因此,没有消息重复。
  • 现在,让我们在组合中添加另一个消费者流程。
  • 现在,消费者组“ some_consumer_group”的消费者1正在监听分区0和1,而消费者组“ some_consumer_group”的消费者2正在监听分区2。
  • 最后,如果我们在该组中再添加一个消费者,那么现在我们让每个消费者都在监听1个分区
  • 如果这是设置,您将不会遇到重复的消息。

同样目前,如果我在pm2集群模式下运行此程序,那么我们所有的内核都将达到CPU使用率的100%。 是否应该这样发生?

我对no-kafka以及消息的处理方式不是很熟悉。

但是请检查在获取下一批消息之前,库是否等待提交发生。

如果没有,您的进程可能会为消息创建过多的处理程序。

基于PM2的群集仅对网络服务器有用,因为群集的进程共享传入的网络端口并分发请求。

在您的情况下,数据源是消息订阅,必须手动将其分发给集群的工作进程。

因此,为了安全起见,主进程应与数据源进行交互,并将消息均匀地分发给工作进程,因此从外部看,它似乎是一个使用者,但仍可以在所有CPU内核上处理消息。

下面的示例演示了不依赖于基于PM2的群集的这种设置:

const cluster = require('cluster');
const _ = require('lodash');
const os = require('os');

// dispatch index
let dispatchIndex = 0;

/**
 * Dispatches data to workers in a cyclic fashion
 * @param {*} data - data to process
 */
function dispatch(data) {

    // ensure master
    if (!cluster.isMaster) {
        throw new Error('Only master can dispatch');
    }

    // get worker ids, sorted
    const workersIds = _.sortBy(_.keys(cluster.workers), _.identity);

    // ensure at least one worker is available
    if (workersIds.length < 1) {
        throw new Error('No worker process alive');
    }

    // select next worker
    dispatchIndex = dispatchIndex >= workersIds.length ? 0 : dispatchIndex;
    const worker = cluster.workers[workersIds[dispatchIndex]];
    dispatchIndex++;

    // send data to worker
    worker.send(data);
}


// Main Script
if (cluster.isMaster) {

    // Setup master process
    console.info(`Master ${process.pid} started.`);

    // fork worker processes to match available CPUs
    const numCpu = os.cpus().length;
    for (let i = 0; i < numCpu; i++) {
        cluster.fork();
    }

    // *** Get/Subscribe data from external source and dispatch to workers ***
    setInterval(() => dispatch({ a: 'value' }), 1000);

} else if (cluster.isWorker) {

    // Setup worker process
    console.info(`Worker ${process.pid} started.`);

    // *** handle dispatched data ***
    process.on('message', (data) => {
        console.info(`Data processed by ${process.pid}`);
    });
}

阅读集群模块文档也很好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM