在我们公司,我们在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
)
如何设置配置以确保每个消费者获得相同数量的消息?
答案 0 :(得分:1)
RabbitMQ只是将消息发送给订阅者而不检查未确认的消息。要获得fair
和Round-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链接