【问题标题】:RabbitMQ Round RobinRabbitMQ 循环
【发布时间】:2016-01-18 21:04:16
【问题描述】:

我正在尝试构建一个系统,其中主服务创建一堆消息并根据路由键将它们路由到正确的队列。我有那个工作,并且消息正在工人/奴隶端消费。但是,我希望工作人员只从队列中获取一条消息,而不是所有 15 条消息。

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

有什么想法吗?

【问题讨论】:

    标签: go rabbitmq amqp


    【解决方案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 {
        // ...
    }
    

    1RabbitMQ's AMQP reference 里也有关于这个的更长的描述:

    长预取大小

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

    [...]

    短预取计数

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

    【讨论】:

      猜你喜欢
      • 2014-05-05
      • 2021-09-11
      • 1970-01-01
      • 1970-01-01
      • 2017-05-02
      • 1970-01-01
      • 2011-02-05
      • 2018-10-07
      • 1970-01-01
      相关资源
      最近更新 更多