Symfony как использовать Mercure с Messenger RabbitMQ?

#symfony #rabbitmq #amqp #messenger #mercure

#symfony #rabbitmq #amqp #messenger #mercure

Вопрос:

Я хочу использовать Mercury с RabbitMQ. Это первый раз, когда я использую Mercury, а также RabbitMQ, поэтому я еще не очень хорош.

Вот где я нахожусь:

Я установил Mercure и Messenger.

Messenger.yaml

 framework:
    messenger:
        # Uncomment this (and the failed transport below) to send failed messages to this transport for later handling.
        failure_transport: failed

        transports:
            # https://symfony.com/doc/current/messenger.html#transport-configuration
             async: '%env(MESSENGER_TRANSPORT_DSN)%'
             failed: '%env(MESSENGER_TRANSPORT_FAILED_DSN)%'
            # sync: 'sync://'

        routing:
            # Route your messages to the transports
            # 'AppMessageYourMessage': async
 

.env:

 MERCURE_PUBLISH_URL=http://localhost:3000/.well-known/mercure
MERCURE_JWT_TOKEN=aVerySecretKey
MESSENGER_TRANSPORT_DSN=amqp://bastien:mypassword@localhost:5672///messages
MESSENGER_TRANSPORT_FAILED_DSN=amqp://bastien:mypassword@localhost:5672///failed
 

И в моем контроллере я смоделировал 50 пингов по URL-адресу моего локального приложения:

     /**
     * @Route("/ping", name="ping", methods={"POST"})
     */
    public function ping(MessageBusInterface $bus)
    {
        for($i=0;$i<=50;$i  )
        {
            $update = new Update("http://monsite.com/ping", "[]");
            $bus->dispatch($update);
        }
        return $this->redirectToRoute('home');
    }
 

Я успешно запустил свой экземпляр Mercury, а также Messenger, который поэтому хорошо связан с моим RabbitMQ.

Но когда я тестирую отправку пингов, это работает, но без прохождения моего RabbitMQ. Я что-то пропустил? Я думаю о своем Messenger.yaml в части маршрутизации, но я не знаю, что поставить, если это так

Комментарии:

1. По умолчанию сообщения выполняются синхронно в Messenger. Возможно, вам потребуется настроить сообщение об обновлении в messenger. yaml для использования асинхронного транспорта

2. Ооооо, хорошо! Я только что добавил SymfonyComponentMercureUpdate: async маршрутизацию в messenger.yaml , и теперь она работает очень хорошо! Теперь я лучше понимаю, как это работает! Большое вам спасибо!

Ответ №1:

По умолчанию сообщения выполняются синхронно в Messenger.

Вам нужно будет настроить сообщение об обновлении в messenger.yaml для использования асинхронного транспорта:

 SymfonyComponentMercureUpdate: async
 

Комментарии:

1. Да, это работает очень хорошо! С другой стороны, возможно ли это, если у меня есть приложение, закодированное на Python, и мне нужно вставить в него элементы RabbitMQ, которые должны быть перехвачены моим приложением Symfony с помощью Messenger? Потому что в моем приложении на Python я не смогу использовать Messenger или поместить объект «Update» в список ожидания RabbitMQ.

2. Вы можете взглянуть на сообщение, отправляемое Symfony при отправке сообщения об обновлении. Если работать с ним непросто / сложно, вы можете добавить промежуточный шаг: переход из Python в очередь, использование и отправка этому потребителю правильно сформированного сообщения об обновлении с конвертом. Это может помочь: symfonycasts.com/screencast/messenger/external-transport