在我们公司,我们用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 只是将消息发送给订阅者,而不检查未确认的消息。要获得公平
和Round-Robin
分配,您可以执行以下操作
首先在消费者 channel 设置
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/