#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