javascript - ZeroMQ + NodeJs:订阅者未收到消息
问题描述
我的发布者 ( zpub.js
) 在循环中发布,如下所示。
async function publishLoop() {
let payload = []
_.forEach(array, (a) => {
// process a here to generate someKey and someValue
payload.push({someKey:someValue})
})
return Promise.all(payload.map(async (p) => {
await zmqp.publish({t:'topicString', m:p})
}))
}
zmqp.publish
简直就是以下。
async publish(payload) {
// this.sock is just a bind to tcp://127.0.0.1:4030
await this.sock.send([payload.t, JSON.stringify(payload.m, null, null)])
return Promise.resolve()
}
我的订阅者 ( zsub.js
) 是 ZeroMQ 网站上的代码版本。
const zmq = require("zeromq")
const mom = require('moment-timezone')
async function run() {
const sock = new zmq.Subscriber
sock.connect("tcp://127.0.0.1:4030")
sock.subscribe("topicString")
for await (const [topic, msg] of sock) {
console.log(`${mom().tz('Asia/Kolkata').format('YYYY-MM-DDTHH:mm:ss.SSS')}`)
}
}
run()
- 我以
node zsub.js > out
. - 我以
node zpub.js
. 成功接收所有消息。 - 该
zpub.js
过程结束但zsub.js
继续运行。当我重新运行node zpub.js
时,订阅者没有收到一条消息。中的记录数out
保持不变。 - 再次运行
zpub.js
一次或两次似乎会将消息(最近的消息;而不是时间戳所看到的较早消息)传递给订阅者。
因此,我不确定在 pub/sub 端要做什么,以免消息“丢失”。请指教。
解决方案
Pub-Sub 本质上是不可靠的,因为订阅者没有反馈给发布者以确认已收到消息。该指南对此进行了详细描述并提供了一些解决方案。解决方案之一是不使用 Pub-Sub,而是使用 Router-Dealer。这是否是可行的替代方案取决于您的用例。
关于您的具体问题,订阅者最终确定与发布者的连接丢失,并将尝试重新连接,直到重新建立连接。根据时间的不同,订阅者可能会错过发布者发送的初始(或所有)消息。
一般来说,如果发布者是通信的稳定部分(如服务器一样保持在线状态)并且订阅者可以进出(如客户端),则 Pub-Sub 效果最佳。
推荐阅读
- php - WordPress - 仅显示与登录用户相关的帖子
- python - 为什么熊猫模块方法 df.to_csv 显示权限错误
- pyspark - 在另一个 spark sql 查询中使用 PySpark Dataframe 列
- python - 在 Python 的 C func 中,浮点变量的格式不正确
- r - 用 mutate_at 替换值总是给出行数不匹配的错误,如何解决这个问题?
- css - webpack HtmlWebpackPlugin 不会创建链接 css 标签
- c# - c# 正则表达式只匹配每个句子的第一个匹配项
- java - 将错误消息从控制器传递到百里香叶
- c# - 从云端到内部网络的信号
- wix - 在安装和主要升级时卸载不同的产品