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

标签 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
)

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

最佳答案

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/

相关文章:

swift - http Post 说它可以工作,但它没有在本地主机上发布

go - InlineKeyboard + Webhook

redis - Message Broker 的粘性 session

rabbitmq - 为什么我们需要在 MSMQ/RabbitMQ 等消息队列系统之上使用 NService Bus/MassTransit 等服务总线框架?

java - RabbitMQ 从 C# 解析 "client_properties" header

c# - 获取 RabbitMQ 消息速率

variables - golang -- 初始化项目变量

google-app-engine - GAE 数据存储是否支持 'partial text search' ?

go - Circleci 和 GoBuffalo 挑战

java - 如何在 spring-amqp 请求/回复消息中设置回复的内容类型?