我正在尝试构建一个系统,其中主服务创建一堆消息并根据路由密钥将它们路由到正确的队列。我有这个工作,消息正在工作/从属方面消耗。但是我希望工作者只从队列中获取一条消息而不是所有15条消息都被放入其中。
我正在看这个https://github.com/streadway/amqp/blob/master/channel.go#L616但是我不知道如何设置它所以只采取了一个事件。
有什么想法吗?
答案 0 :(得分:1)
免责声明:我还没有使用Go AMQP客户端,但AMQP协议语义应该在客户端实现中具有通用性,因此我会采取行动。
您已经正确地将prefetch-size
和prefetch-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。
[...]
短预取计数
根据整个消息指定预取窗口。该字段可以与预取大小字段结合使用;如果预取窗口(以及通道和连接级别的窗口)都允许,则只会提前发送消息。 [...]