在使用 RabbitMQ 和 Symfony Messenger 实现 AMQP 服务时,我感觉错过了一些东西。
从 RabbitMQ 的角度来看,消费者(也称为工作人员)从队列中消费。
从 Symfony Messenger 文档中,一个“传输”链接到一个消费者。这是设计使然,如命令所示bin/console messenger:consume transport
。因此,对于每个“处理程序”,您必须配置一个专用传输,messenger.yaml
以便能够分配特定数量的进程(例如通过 Supervisor 配置numprocs
变量)。
如前所述,我找到了一种使用 2 种不同传输方式配置该用例的方法。然而,这对我来说看起来有点太复杂了:
framework:
messenger:
transports:
one_transport:
dsn: '%env(MESSENGER_TRANSPORT_DSN)%'
options:
exchange:
name: my_exchange
type: direct
queues:
one_queue:
binding_keys:
- one_binding_key
another_transport:
dsn: '%env(MESSENGER_TRANSPORT_DSN)%'
options:
exchange:
name: my_exchange
type: direct
queues:
another_queue:
binding_keys:
- another_binding_key
routing:
'App\MessageBroker\Message\OneNotification': one_transport
'App\MessageBroker\Message\AnotherNotification': another_transport
# In action 1
$this->dispatchMessage(
new OneNotification(), [new AmqpStamp('one_binding_key')]
);
# Action 2
$this->dispatchMessage(
new AnotherNotification(), [new AmqpStamp('another_binding_key')]
);
# SF consumer 1
[program:messenger-consume]
command=php bin/console messenger:consume one_transport
numprocs=4
# SF consumer 2
[program:messenger-consume]
command=php bin/console messenger:consume another_transport
numprocs=1
没有其他方法可以实现这一目标吗?