Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 如何确保消息平均发送给所有消费者_Go_Rabbitmq - Fatal编程技术网

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

Go 如何确保消息平均发送给所有消费者,go,rabbitmq,Go,Rabbitmq,在我们公司,我们在Go中构建了一个推送服务,并将其放在四台机器上以确保传输速度,当我们需要发送通知时,我们将消息发送到rabbitMQ,然后推送服务将从队列中获取消息,但有时我们发现只有一台机器获取消息 以下是rabbitMQ使用者的配置: msgs, err := ch.Consume( q.Name, // queue consumerTag, // consumer true, // auto-ack false, //

在我们公司,我们在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只将消息发送给订阅者,而不检查未确认的消息。要获得
公平
循环
分配,您可以执行以下操作

  • 首先在消费者频道中设置
    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
之前停机,则这些消息将重新排队并交付给另一消费者进行处理。有关此信息的更多信息,请查看链接“只有一台机器收到此消息”;这是队列的预期行为,不是吗?