簡體   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