[英]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)标志创建的,这确认了配置是正确的。 然而,当多个消费者启动时,它们并行接收任务,而不是等待前一个任务完成,事实上,就好像根本没有设置单活动消费者标志一样。
你能告诉我我做错了什么吗?
前提条件:
只有我需要做的是在 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.