【发布时间】:2016-01-18 21:04:16
【问题描述】:
我正在尝试构建一个系统,其中主服务创建一堆消息并根据路由键将它们路由到正确的队列。我有那个工作,并且消息正在工人/奴隶端消费。但是,我希望工作人员只从队列中获取一条消息,而不是所有 15 条消息。
我在看这个https://github.com/streadway/amqp/blob/master/channel.go#L616,但是我不知道如何设置它,所以只记录了一个事件。
有什么想法吗?
【问题讨论】:
我正在尝试构建一个系统,其中主服务创建一堆消息并根据路由键将它们路由到正确的队列。我有那个工作,并且消息正在工人/奴隶端消费。但是,我希望工作人员只从队列中获取一条消息,而不是所有 15 条消息。
我在看这个https://github.com/streadway/amqp/blob/master/channel.go#L616,但是我不知道如何设置它,所以只记录了一个事件。
有什么想法吗?
【问题讨论】:
免责声明:我没有使用过 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 {
// ...
}
1RabbitMQ's AMQP reference 里也有关于这个的更长的描述:
长预取大小
客户端可以提前请求发送消息,这样当客户端处理完一条消息后,后面的消息就已经保存在本地了,而不需要沿着通道发送。 [...] 如果消息的大小等于或小于可用的预取大小(并且还属于其他预取限制),服务器将提前发送一条消息。 可以设置为零,表示“没有特定限制”,尽管其他预取限制可能仍然适用。如果设置了 no-ack 选项,则预取大小将被忽略。
[...]
短预取计数
根据整个消息指定预取窗口。该字段可以与 prefetch-size 字段结合使用;只有在两个预取窗口(以及通道和连接级别的窗口)都允许的情况下,才会提前发送消息。 [...]
【讨论】: