在我们公司中,我们在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
)

如何设置配置以确保每个使用者都收到相同数量的消息?

最佳答案

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链接

    关于go - 如何确保邮件平均发送给所有消费者,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50873566/

    10-16 21:51