【问题标题】:Prefetch and Message processing order in RabbitMQRabbitMQ 中的预取和消息处理顺序
【发布时间】:2020-12-03 04:07:48
【问题描述】:

我有一个消费专用通道和 50 个队列,每个队列只有一个消费者。 通道的预取值为 5,它适用于 each consumer of the channel

我的应用程序需要完全按照在每个队列中接收消息的顺序处理消息。 由于高预取值,队列的消费者是否可以开始处理下一条消息而不确认较早的消息?我正在使用带有ampqlib的NodeJS

【问题讨论】:

    标签: node.js rabbitmq


    【解决方案1】:

    答案是这取决于您使用的语言。

    在 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多