3

在使用 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

没有其他方法可以实现这一目标吗?

4

0 回答 0