Docker部署的Symfony项目Redis优先级队列配置异常问题求助
问题根因分析
- 核心配置错误:高低优先级两个传输配置了完全相同的Redis DSN路径,本质是指向了同一个Redis Stream队列,两类消息没有做物理隔离,所以不管启动哪个传输的消费者,都会读到队列内所有的消息。你启动消费者时重复传入两次
async_priority_high没有任何作用,Symfony Messenger的消费优先级是按命令后传入的传输顺序判断的,需要按优先级顺序传入不同的传输名才会生效。 - 第二个报错问题根因:因为两类消息存在同一个队列,你启动仅消费
async_priority_high的消费者时,依然会读到队列里的MessageLowPriority消息,而你给低优先级消息的处理器加了from_transport => async_priority_low的限制,该处理器不会处理从async_priority_high传输获取的低优先级消息,就会抛出找不到对应处理器的错误。
修复方案
- 首先修改
messenger.yaml中两个传输的DSN配置,让二者指向独立的Redis Stream队列:
framework: messenger: transports: async_priority_high: dsn: 'redis://%env(REDIS_QUEUE_NAME)%:6379/messages/symfony/high-consumer-%env(CONSUMER_ID)%&auth=%env(REDIS_PASSWORD)%' # 其余原有配置保持不变 async_priority_low: dsn: 'redis://%env(REDIS_QUEUE_NAME)%:6379/messages/symfony/low-consumer-%env(CONSUMER_ID)%&auth=%env(REDIS_PASSWORD)%' # 其余原有配置保持不变
修改后两类消息会分别存入两个独立的Redis队列,不会再出现消费错位的问题。
- 调整消费者启动命令:
- 仅消费高优先级队列,直接执行:
bin/console messenger:consume async_priority_high -vv,不会再读到低优先级消息 - 需要同时消费两类队列且优先处理高优先级消息,按优先级顺序传入传输即可:
bin/console messenger:consume async_priority_high async_priority_low -vv,消费者会优先拉取高优先级队列的消息,高优先级队列为空时才会拉取低优先级的消息。
- 处理器配置说明:
如果需要给处理器加from_transport限制,确保每个消息对应处理器的from_transport和消息路由的传输名一致即可,修改队列路径后不会再出现找不到处理器的报错,低优先级处理器示例配置如下:
services: App\MessageHandler\LowPriorityHandler: tags: - { name: messenger.message_handler, from_transport: async_priority_low }
内容的提问来源于stack exchange,提问作者Artem Sityaev
相关产品推荐
相关产品推荐

