繁体   English   中英

Symfony Messenger 顺序消息处理和 RabbitMQ 上的 x-single-active-consumer 参数

[英]Symfony Messenger sequential message processing and the x-single-active-consumer argument on RabbitMQ

我在我的应用程序中使用 Symfony Messenger 和 RabbitMQ 适配器。 应用程序的逻辑是,来自同一个队列的消息必须按顺序执行,一个接一个(顺序不重要),即使该队列被多个消费者监听。 换句话说,如果至少有一条消息未被确认,则队列不应发出其他消息。

为了解决这个问题,我在文档中找到了一个选项,例如 x-single-active-consumer ( https://www.rabbitmq.com/consumers.html#single-active-consumer )。

配置是这样的:

  my-queue:
    dsn: amqp://guest:guest@localhost:5672/%2f/my-queue
    options:
      queues:
        my-queue:
          arguments:
            x-single-active-consumer: true

UI 显示队列是使用 SAC(single-active-consumer)标志创建的,这确认了配置是正确的。 然而,当多个消费者启动时,它们并行接收任务,而不是等待前一个任务完成,事实上,就好像根本没有设置单活动消费者标志一样。

你能告诉我我做错了什么吗?

前提条件:

  • symfony/信使 4.4.*
  • RabbitMQ 3.8 +

只有我需要做的是在 Rabbit Admin 中删除队列并让消费者注册新的。

无法使用策略启用单个活动消费者。 这就是原因。 RabbitMQ 中的策略本质上是动态的,它们可以出现在 go 中,启用和禁用它们声明的功能。 想象一下突然禁用队列上的单个活动消费者:代理将开始向非活动消费者发送消息,并且消息将被并行处理,这与单个活动消费者试图实现的完全相反。 由于单个活动消费者的语义不能很好地适应策略的动态特性,因此只能在声明队列时启用此功能,队列 arguments

https://www.rabbitmq.com/consumers.html#single-active-consumer

您可以从rabbitmq 容器验证设置(或在您拥有兔子时使用rabbitmqadmin

rabbitmqadmin export rabbit.definitions.json
...
"queues": [
    {
        "name": "some-queue",
        "vhost": "/",
        "durable": true,
        "auto_delete": false,
        "arguments": {
            "x-single-active-consumer": true <--------------
        }
    }
],
"exchanges": [
    {
        "name": "my-exchange",
        "vhost": "/",
        "type": "direct", <---------------------------------
        "durable": true,
        "auto_delete": false,
        "internal": false,
        "arguments": {}
    }
}
...

编辑#1:你们很多人还想检查交换是direct的类型。 symfony/messenger默认是fanout ,它将消息分发给所有可用的消费者。

扇出交换非常简单。 正如您可能从名称中猜到的那样,它只是将收到的所有消息广播到它知道的所有队列。

https://www.rabbitmq.com/tutorials/tutorial-three-python.html

config/messenger.yml

...
my-binding:
    dsn: 'some-dsn'
    options:
        exchange:
           name: my-echange
           type: direct

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM