RabbitMQ Round Robin

时间:2016-01-18 21:04:16

标签: go rabbitmq amqp

我正在尝试构建一个系统,其中主服务创建一堆消息并根据路由密钥将它们路由到正确的队列。我有这个工作,消息正在工作/从属方面消耗。但是我希望工作者只从队列中获取一条消息而不是所有15条消息都被放入其中。

我正在看这个https://github.com/streadway/amqp/blob/master/channel.go#L616但是我不知道如何设置它所以只采取了一个事件。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

免责声明:我还没有使用Go AMQP客户端,但AMQP协议语义应该在客户端实现中具有通用性,因此我会采取行动。

您已经正确地将prefetch-sizeprefetch-count参数标识为要调整的配置变量。 RabbitMQ documentation在这方面说了以下内容: 1

  

AMQP指定basic.qos方法,允许您在消费时限制频道(或连接)上的未确认消息数(又称"预取计数")

如果您希望每个消费者一次只发送一条消息,则应将prefetch-count设置为1,并将prefetch-size保留为未定义(即0):

err := channel.Qos(1, 0, false)
if err != nil {
    // ...
}

1 RabbitMQ's AMQP reference对此内容的描述也较长:

  

long prefetch-size

     

客户端可以请求提前发送消息,以便在客户端完成消息处理时,以下消息已经在本地保存,而不是需要沿着通道发送。 [...] 如果服务器的大小等于或小于可用的预取大小(并且还属于其他预取限制),则它将提前发送消息。 可以设置为零,意味着"没有特定限制",尽管其他预取限制可能仍然适用。如果设置了no-ack选项,则忽略prefetch-size。

     

[...]

     

短预取计数

     

根据整个消息指定预取窗口。该字段可以与预取大小字段结合使用;如果预取窗口(以及通道和连接级别的窗口)都允许,则只会提前发送消息。 [...]