Yandex Message Queue в Symfony Messanger

В веб-приложениях часто требуется выполнять некоторые операции асинхронно. Для этого используются очереди сообщений. Можно использовать протокол 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 работает нормально

Добавить комментарий