【发布时间】:2020-12-03 04:07:48
【问题描述】:
我有一个消费专用通道和 50 个队列,每个队列只有一个消费者。 通道的预取值为 5,它适用于 each consumer of the channel。
我的应用程序需要完全按照在每个队列中接收消息的顺序处理消息。 由于高预取值,队列的消费者是否可以开始处理下一条消息而不确认较早的消息?我正在使用带有ampqlib的NodeJS
【问题讨论】:
我有一个消费专用通道和 50 个队列,每个队列只有一个消费者。 通道的预取值为 5,它适用于 each consumer of the channel。
我的应用程序需要完全按照在每个队列中接收消息的顺序处理消息。 由于高预取值,队列的消费者是否可以开始处理下一条消息而不确认较早的消息?我正在使用带有ampqlib的NodeJS
【问题讨论】:
答案是这取决于您使用的语言。
在 JS 中,如果我们在回调中执行异步操作,它将不会被排序。 为了确保它是有序的,我们可以利用 JS 是单线程这一事实的技巧。 这是一个粗略的想法,您可以使用哈希图将其扩展到多个队列。
beingProcessed = false;
.on("messageFromQueue", (msg) => { // sync callback
// very important that the callback here does no async work prior to inserting into the
// queue to guarantee that the next message won't be pushed first
queue.push(msg); // in memory queue
processSerially(msg);
})
async processSerially() {
if(beingProcessed || queue.size() === 0) {
return;
}
beingProcessed = true;
while(queue.size() > 0) {
await doSomeTaskAsyncWithMessage(queue.pop())
}
beingProcessed = false;
}
【讨论】: