Настройте потребителя Simple Queue Service (SQS) менее чем за 20 строк кода для асинхронной обработки сообщений

Поскольку некоторые рабочие нагрузки не требуют мгновенной обратной связи с конечным пользователем (например, обработка / преобразование видео), асинхронная обработка сообщений в последние годы стала чрезвычайно привлекательным предложением. Благодаря AWS у вас под рукой есть платформа обмена сообщениями, где вам не нужно беспокоиться об управлении инфраструктурой, а вместо этого сосредоточиться на предоставлении ценности вашим клиентам.

Что вам понадобится

  • Java 8 или выше
  • Gradle / Maven
  • Аккаунт AWS
  • Пользователь IAM с доступом SQS

Настройка проекта

Как и любой проект Spring, Spring Initialiser предоставляет простой и удобный способ создания проекта. Давайте добавим все зависимости, которые нам понадобятся, а затем откроем проект в вашей любимой среде IDE.

Создание асинхронного клиента SQS

Обратите внимание, что здесь мы используем DefaultAWSCredentialsProviderChain для получения учетных данных IAM, а не для определения поставщика статических учетных данных. Это сообщит Spring Cloud использовать учетные данные, предоставленные в среде, для настройки доступа, поэтому вам не нужно указывать какие-либо учетные данные при развертывании приложения (все AWS сервисы предварительно настроили их).

Настройка Spring Cloud

По умолчанию Spring Cloud Messaging считает, что вы запускаете свое приложение с использованием шаблона CloudFormation. Когда вы запустите свое приложение, оно выдаст исключение о том, что стек не существует, поэтому это отключает эту функцию. Если вы не используете CloudFormation, установите для свойства выше значение false.

Настройка SQS

Введите SQS в поиск по сервису Консоли AWS и выберите первый появившийся вариант Simple Queue Service (SQS)

Нажмите кнопку Get Started Now и введите имя своей очереди. В этом уроке я буду использовать sqs-demo. Выберите желаемый тип очереди (не требует пояснений) и нажмите Quick Create Queue

Добавление потребителя SQS

Настройте нового потребителя и аннотируйте его с помощью @Component, чтобы Spring мог загружать новый класс, и @Slf4j, чтобы мы могли получить некоторые функции ведения журнала, предоставляемые Lombok.

Аннотирование нашего метода с помощью @SqsListener("QUEUE_NAME") говорит Spring взять эту очередь из SQS и начать прослушивание сообщений. Запустите приложение, и если теперь мы отправим тестовое сообщение в интерфейсе SQS, мы должны увидеть его в нашей консоли.

Обработка сообщений JSON

Определите новую модель (не обязательно должна быть идентичной модели ниже), которую мы собираемся использовать для десериализации сообщений, которые мы получаем на слушателе.

Spring Cloud Messaging настраивает собственный объектный сопоставитель при сериализации / десериализации сообщений, которые он отправляет / получает. К сожалению, он не поддерживает JSON, поэтому нам нужно его настроить.

По сути, мы определяем новый конвертер сообщений с помощью средства отображения объектов по умолчанию для наших приложений, а затем передаем его QueueMessageHandlerFactory, который сообщает Spring использовать наш настраиваемый конвертер сообщений при десериализации сообщений, которые он получает в своих слушателях. Измените входной параметр, который вы указали в своем @SqsListener, на вновь созданную модель и отправьте другое сообщение, на этот раз в формате JSON, и вы должны увидеть его в логе на консоли.

Подведение итогов

К настоящему моменту вы, наверное, видите, насколько легко настроить и обрабатывать сообщения асинхронно. Итак, давайте подведем итоги

  • Сервисы AWS: устраняет излишнее управление инфраструктурой, масштабированием и т. д.
  • Spring Cloud Messaging: предоставляет абстрактный способ определения API обмена сообщениями независимо от поставщика услуг.
  • DefaultAWSCredentialsProviderChain: использует переменные среды для настройки доступа IAM.
  • Сериализация / десериализация Джексона: по умолчанию не поддерживается, требуется дополнительная настройка.

Полный исходный код проекта можно найти здесь со всей сущностью, использованной в этом руководстве.

использованная литература

Spring Инициализатор

Исходный код проекта