![](/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.