![](/img/trans.png)
[英]How can i detect that publisher is disconnected with ZeroMQ and Node.js
[英]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.