簡體   English   中英

如何在Node.js中使ZeroMQ發布者冗余?

[英]How to make a ZeroMQ publisher redundant in Node.js?

是否存在用於使節點0mq pub / sub中的發布者冗余的通用模式? 這樣做的動機是能夠與可能會失敗/定期重新啟動的發布者一起運行多個流程。

我最初的想法是在母版中創建一個轉發器,並從工作發布者處連接到它:

var cluster = require('cluster')
  , zmq = require('zmq')
  , endpointIn = 'ipc:///tmp/cluster_pub_sub'
  , endpointOut = 'tcp://127.0.0.1:7777';

if (cluster.isMaster) {
  for (var i = 0; i < 2; i++) cluster.fork();
  startPubSubForwarder();
} else {
  startPublisher();
}

function startPublisher() {
  var socket = zmq.socket('pub');
  socket.connect(endpointIn);
  setInterval(function () {
    socket.send('pid=' + process.pid);
  }, 1000);
}

function startPubSubForwarder() {
  var sIn = zmq.socket('sub')
    , sOut = zmq.socket('pub');

  // incoming
  sIn.subscribe('');
  sIn.bind(endpointIn, function (err) {
    if (err) throw err;
  });
  sIn.on('message', function (data) {
    sOut.send(data);
  });

  // outgoing
  sOut.bind(endpointOut, function (err) {
    if (err) throw err;
  });
}

還有其他/更好的方法嗎?

如果您關心的是消息的持久性,那么我想您會更不用擔心擁有多個發布者,而更關注確保發布者去世時不會丟失消息。 您可以立即立即重新啟動發布者,然后從停下來的地方領取。 您還需要知道哪些消息已成功發送。

這需要1)持久存儲和2)以及向發布者確認消息已在接收者端接收(並且可能已完成處理)的方法。 此設置應解決您的可靠性要求。

如果您還想實現高規模,則需要對體系結構進行一些擴充。 對於發送方和接收方為1:1的發送/接收方案,它更簡單,而當您需要進行1:N循環/負載分配方案時,情況可能會稍微復雜一些,這可能是擴展規模所需要的。

我對完成橫向擴展方案的投入是要進行以下設置:

sender_process-(1:1)->分發服務器-(1:N)-> receiver_process(es)

分發者在其中確認收到了發件人的消息,然后將其扇形展開到接收者的進程。

您可能希望通過在每個流程的前面放置一個隊列來實現此目的。 因此,您不會發送到該過程。 您發送到該進程讀取的隊列。 發件人將物料放入分發服務器隊列。 分發者將內容放入接收者的隊列中。 在每個點上,每個過程都會嘗試進行處理。 如果經過多次最大重試后失敗,它將進入錯誤隊列。

我們使用rabbitmq / amqp來完成所有這些工作。 我已經開始開源總線,用於執行1:1和1:N的總線在這里發送: https : //github.com/mateodelnorte/servicebus 在接下來的幾天中,我將添加自述文件和更多測試。

從您的示例代碼中,我認為XPUB / XSUB 0MQ模式是最合適的。 這是實現相同的“ startPubSubForwarder()”塊的一種更有效的方法,此外,您的訂閱方也可以直接在發布方的后端上訂閱某些模式,從而獲得了好處。 在這里,我留下了一個鏈接,其中包含發布者/ xpub-xsub(以代理方式)/下標者的示例: https : //github.com/krakatoa/node_zmq_workshop/tree/master/03.3_news_proxy 它是NodeJS代碼(這是我的,不要介意詢問細節!)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM