TL; DR
Как уже правильно указал @joseph, вы можете использовать отображение источника событий с BatchSize , установленным в 1. Это будет getRecords()
вернуть максимально 1 SQSMessage . Чтобы обрабатывать максимум 1 сообщение за раз, вы должны установить для зарезервированного параллелизма функции Lambda значение 1. Однако, как также правильно указано, это не оптимально для стандарта SQS очередь. При отображении источника события возникнет TooManyRequestsException: Rate Exceeded ошибок, которые регистрируются в журналах CloudWatch.
Чтобы использовать правильный шаблон последовательной обработки по одному сообщению за один раз без полагаясь на регулирование лямбда-функции, используйте очередь SQS FIFO, как описано в блоге AWS [1]. В нем говорится: «Общий параллелизм равен или меньше числа уникальных MessageGroupIds в очереди SQS FIFO». Таким образом, вы можете настроить ровно одну MessageGroupId для своей очереди SQS FIFO, чтобы:
- только когда-либо запускать лямбду один раз за сообщение в очереди SQS (потому что batchSize = 1)
- при соблюдении «максимального числа одновременных лямбда-экземпляров», равного ровно 1 (потому что число параллелизма = # уникальные идентификаторы группы сообщений = 1)
Таким образом, число уникальных идентификаторов группы сообщений равно макс. число одновременных лямбда-вызовов при сопоставлении источника событий для очереди SQS FIFO.
Дополнительная информация
Java Библиотеки для Lambda
Насколько я вижу, AWS предоставил набор POJO (например, SQSEvent
в библиотеке aws -lambda- java -events ) [2] для обработки входящего события SQS [3]. Событие SQS доставляется сопоставлением источника события Lambda и десериализуется в заданный POJO. Документы для POJO SQSEvent также доступны на JavaDo c .io [4], а исходный код доступен на GitHub [5]. Метод getRecords()
возвращает список SQSMessage
объектов, поскольку сопоставление источника событий AWS Lambda действительно может обеспечить от 1 до 10 сообщений SQS.
Сопоставление источника событий Lambda
Событие сопоставление источника создается и настраивается с атрибутами, которые задают c для типа источника. Поскольку мы рассматриваем интеграцию SQS, мы должны учитывать только атрибуты SQS-Speci c. В основном это: BatchSize и EventSourceArn . Полный список см. В [6]. Если атрибут не применим к типу источника SQS, его описание начинается с ключевого слова (Streams)
.
. Необходимо установить BatchSize , если вы хотите ограничить количество сообщений SQS, которое получены с помощью getRecords()
. Значение по умолчанию - 10.
Лямбда-масштабирование
Как описано в документации [7], лимит Lambda может быть использован для ограничения количества пакетов сообщений SQS, которые обрабатываются одновременно Лямбда-функция. Однако это не мешает сопоставлению источника событий вызывать функцию Lambda. По крайней мере, я не смог найти ни одного официального источника, который бы заявлял обратное - исправьте меня, если я ошибаюсь.
То есть выдается много ошибок регулирования (код 429), если интенсивно используется очередь SQS. , Эту проблему можно решить, если указать источнику события последовательно обрабатывать сообщения. Это достигается с помощью источника событий Amazon SQS FIFO. Это довольно новая функция. [8]
Резюме
В целом, я бы рекомендовал:
- использовать очередь SQS с типом FIFO вместо стандартного типа
- использовать сопоставление источника событий с BatchSize, установленным в 1
- , использовать то же значение для атрибута MessageGroupId во всех SQS SendMessage вызовах API [9]
- быть знакомым с различиями между очередями SQS FIFO и стандартными очередями [10] [11] - включая различия в ценах [12]
- не обязательно устанавливать зарезервированный параллелизм, поскольку он обрабатывается источником события отображение для очередей FIFO
Ссылки
[1] https://aws.amazon.com/blogs/compute/new-for-aws-lambda-sqs-fifo-as-an-event-source/
[2] https://docs.aws.amazon.com/lambda/latest/dg/with-sqs-create-package.html#with -sqs-example-deploy-pkg- java
[3] https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html
[4] https://javadoc.io/static/com.amazonaws/aws-lambda-java-events/2.2.2/com/amazonaws/services/lambda/runtime/events/SQSEvent.html
[5] https://github.com/aws/aws-lambda-java-libs/blob/master/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/SQSEvent.java
[6] https://docs.aws.amazon.com/lambda/latest/dg/API_CreateEventSourceMapping.html#API_CreateEventSourceMapping_RequestBody
[7] https://docs.aws.amazon.com/lambda/latest/dg/configuration-concurrency.html
[8] https://aws.amazon.com/about-aws/whats-new/2019/11/aws-lambda-supports-amazon-sqs-fifo-event-source/?nc1=h_ls
[9] https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html
[10] https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/using-messagegroupid-property.html
[11] https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html#FIFO -перемещение очереди
[12] https://aws.amazon.com/sqs/pricing/?nc1=h_ls