为了账号安全,请及时绑定邮箱和手机立即绑定

RabbitMQ 循环

RabbitMQ 循环

Go
狐的传说 2021-12-13 10:36:57
我正在尝试构建一个系统,其中主服务创建一堆消息并根据路由键将它们路由到正确的队列。我有那个工作,并且消息正在工人/从属方被消耗。但是,我希望工作人员只从队列中取出一条消息,而不是将所有 15 条消息都放入其中。我在看这个https://github.com/streadway/amqp/blob/master/channel.go#L616但是我不确定如何设置它所以只发生了一个事件。有任何想法吗?
查看完整描述

1 回答

?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

我没有使用过 Go AMQP 客户端,但 AMQP 协议语义在客户端实现中应该是通用的,所以我会试一试。


您已经正确地将prefetch-size和prefetch-count参数标识为要调整的配置变量。该RabbitMQ的文件说,在这方面的情况如下:1


AMQP 指定了basic.qos一种方法,允许您在使用时限制通道(或连接)上未确认消息的数量(又名“预取计数”)。


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


err := channel.Qos(1, 0, false)

if err != nil {

    // ...

}

1 在RabbitMQ 的 AMQP 参考中还有一个更长的描述:


长预取大小


客户端可以请求提前发送消息,这样当客户端处理完一条消息时,后面的消息就已经在本地保存了,而不需要通过通道向下发送。[...]如果消息的大小等于或小于可用的预取大小(并且还属于其他预取限制),则服务器将提前发送消息。可以设置为零,表示“没有特定限制”,尽管其他预取限制可能仍然适用。如果设置了 no-ack 选项,则忽略 prefetch-size。


[...]


短预取计数


根据整个消息指定预取窗口。该字段可以与 prefetch-size 字段结合使用;只有在两个预取窗口(以及通道和连接级别的窗口)都允许的情况下,才会提前发送消息。[...]


查看完整回答
反对 回复 2021-12-13
  • 1 回答
  • 0 关注
  • 150 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号