В веб-приложениях часто требуется выполнять некоторые операции асинхронно. Для этого используются очереди сообщений. Можно использовать протокол AMQP, например RabbitMq или Kafka.
В рамках облаков часто используется Amazon SQS. В России же есть Yandex, который в рамках Yandex Cloud предоставляет сервис Message Queue, который является реализацией протокола Amazon SQS. Таким образом, инструменты разработчика от SQS подходят и для YMQ.
На данный момент в YMQ используется протокол на основе XML, который уже не используется в официальном SDK, там уже JSON, поэтому из коробки ничего не работает. Разработчики обещают обеспечить поддержку в будущем, но без указания сроков.
Для того что бы использовать Yandex Message Queue в Symfony Messanger требуется установить библиотеку для работы с SQS:
composer require symfony/amazon-sqs-messenger
Далее в .env:
MESSENGER_TRANSPORT_DSN=sqs://message-queue.api.cloud.yandex.net/<id>/<id>/<queueName>?access_key=<key>&secret_key=<secret>
Этот адрес можно взять в консоли управления Yandex Cloud.
Здесь:
id/id — это часть URL из консоли управления, key и secret — это статические ключи доступа для YMQ. Требуются права ymq.writer, ymq.reader
Если сейчас запустить вычитку очереди через php bin/console messanger:consume <название очереди>
, то получим ошибку: 400 Bad request. Так происходит из-за того, что для обмена данными используется формат xml, а библиотека по умолчанию пытается использовать JSON.
Symfony для связи с AWS использует библиотеку AsyncAWS. Для SQS используется ее часть — async-aws/sqs. В версии 2.0 используется JSON, а вот в 1.9 — XML.
Для того, что бы Messanger использовал XML для коммуникации с SQS-совместимым сервисом нужно добавить явную зависимость на эту библиотеку:
composer require async-aws/sqs ^1.9
После этого YMQ через Symfony Messanger работает нормально