如何确保消息平均发送给所有消费者

时间:2018-06-15 10:17:28

标签: go rabbitmq

在我们公司,我们在Go中构建了一个推送服务,我们把它放在四台机器上以确保传输速度,当我们需要发送通知时我们向rabbitMQ发送消息,然后推送服务将从队列中获取消息,但有时候我们发现只有一台机器可以收到消息。

以下是rabbitMQ消费者的配置:

msgs, err := ch.Consume(
    q.Name,      // queue
    consumerTag, // consumer
    true,        // auto-ack
    false,       // exclusive
    false,       // no-local
    false,       // no-wait
    nil,         // args
)

如何设置配置以确保每个消费者获得相同数量的消息?

1 个答案:

答案 0 :(得分:1)

RabbitMQ只是将消息发送给订阅者而不检查未确认的消息。要获得fairRound-Robin分发,您可以执行以下操作

  • 首先在消费者频道中设置QOS

        err = ch.Qos(
            1,     // prefetch count
            0,     // prefetch size
            false, // global
    )
    
  • 接下来,在消费者

    中将自动确认设置为false
        msgs, err := ch.Consume(
            q.Name, // queue
            "",     // consumer
            false,  // auto-ack
            false,  // exclusive
            false,  // no-local
            false,  // no-wait
            nil,    // args
    )
    
  • 接下来,每次从每个消费者处理消息结束时,将ack发送给Rabbitmq

    msg.Ack(false)

此模式称为工作队列,这样可以避免丢失消息,如果消费者在发送ack之前关闭,那么这些消息将被重新排队并传递给另一个消费者进行处理。有关详细信息,请查看this链接

相关问题