【发布时间】:2022-02-06 21:02:03
【问题描述】:
我正在尝试创建一个库存监控应用程序。我有两个 ZeroMQ 发布者正在运行,它们从两个各自的服务中获取当前股票价格。第一个服务是主要的信息来源,不能丢弃来自该服务的任何消息。
我想把两个价格合并成一个对象,然后推送到前端。 每条消息都有一个时间戳,表示观察价格的时间,是组合消息的基础。
但是,两条消息不会同时到达,系统必须等待两条消息都到达,然后将它们组合起来,然后将它们推送到前端。
我已经能够使用内存映射来使其工作,该映射存储按时间戳索引的消息并检查两条消息是否都已到达。如果他们没有,它会在发送消息之前等待一段时间。消息传递应该是有序的,并且不能丢弃来自第一个服务的数据。
const messageQueue = new Map();
monitoringServiceOne.on('message', function (topic, message) {
synchroniseMessages(topic, message);
});
monitoringServiceTwo.on('message', function (topic, message) {
synchroniseMessages(topic, message);
});
function synchroniseMessages(topicName, incomingMessage) {
if (topicName == "ServiceOne") {
const message = messageQueue.get(message.time);
// If message exists, it means service two message has been received
if (message) {
pushToFE({ ... { message }, "ServiceOne": incomingMessage })
} else {
setTimeout(() => {
const message = messageQueue.get(message.time);
if (message) {
pushToFE({ ... { message }, "ServiceOne": incomingMessage })
}
}, DELAY)
}
messageQueue.set(message.time, { "ServiceOne": incomingMessage });
} else {
const message = messageQueue.get(message.time);
// If message exists, it means service one message has been received
if (message) {
pushToFE({ ... { message }, "ServiceTwo": incomingMessage })
} else {
messageQueue.set(message.time, { "ServiceTwo": incomingMessage });
}
}
}
即使这行得通,我还是想重新发明轮子。是否有任何现有的 ZeroMQ 范例或模式可用于改进代码?我一直在寻找一种事件驱动模式,它允许我定义接收器的逻辑。
【问题讨论】:
标签: node.js message-queue zeromq