Go 如何确保消息平均发送给所有消费者
在我们公司,我们在Go中构建了一个推送服务,并将其放在四台机器上以确保传输速度,当我们需要发送通知时,我们将消息发送到rabbitMQ,然后推送服务将从队列中获取消息,但有时我们发现只有一台机器获取消息 以下是rabbitMQ使用者的配置:Go 如何确保消息平均发送给所有消费者,go,rabbitmq,Go,Rabbitmq,在我们公司,我们在Go中构建了一个推送服务,并将其放在四台机器上以确保传输速度,当我们需要发送通知时,我们将消息发送到rabbitMQ,然后推送服务将从队列中获取消息,但有时我们发现只有一台机器获取消息 以下是rabbitMQ使用者的配置: msgs, err := ch.Consume( q.Name, // queue consumerTag, // consumer true, // auto-ack false, //
msgs, err := ch.Consume(
q.Name, // queue
consumerTag, // consumer
true, // auto-ack
false, // exclusive
false, // no-local
false, // no-wait
nil, // args
)
如何设置配置以确保每个使用者获得相同数量的消息?RabbitMQ只将消息发送给订阅者,而不检查未确认的消息。要获得
公平
和循环
分配,您可以执行以下操作
- 首先在消费者频道中设置
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(假)
此模式称为工作队列,这也避免了消息丢失,如果消费者在发送
ack
之前停机,则这些消息将重新排队并交付给另一消费者进行处理。有关此信息的更多信息,请查看链接“只有一台机器收到此消息”;这是队列的预期行为,不是吗?