#amazon-web-services #concurrency #aws-lambda #amazon-kinesis
#amazon-веб-сервисы #параллелизм #aws-лямбда #amazon-kinesis
Вопрос:
У меня есть лямбда-код с источником события, указывающим на потребителя потока Kinesis (с произвольным количеством сегментов)
Я хотел бы убедиться, что элементы в потоке с одним и тем же «ключом раздела» обрабатываются Lambda последовательно, а не одновременно. (Это используется в качестве идентификатора объекта, и я не хочу, чтобы несколько лямбд одновременно выполняли логику для одного и того же объекта.)
Например, если элементы в потоке имеют ключи разделов:
1,2,1,3,4,1,2,1
Если мы примем порядок обработки слева направо, Lambda будет обрабатывать элемент с каждым из ключей раздела 1,2, 3 и 4 одновременно. Затем, когда он завершит работу с элементом с определенным ключом раздела, он может начать обработку другого элемента с этим ключом.
Достижимо ли это каким-либо образом без использования распределенной блокировки, которая сделала бы неэффективным использование Lambda?
Спасибо
Ответ №1:
Элементы с одинаковым «ключом раздела» будут последовательно обрабатываться Lambda для сопоставления источника события потока.
Кроме того, вы можете указать «одновременные пакеты для каждого сегмента» при создании лямбда-триггера:
- Если «одновременные пакеты на сегмент» равно 1 (по умолчанию один), то порядок будет сохранен для всего сегмента.
- Если значение «одновременные пакеты на сегмент» равно [2; 10], то порядок будет сохранен только для записей с одинаковым ключом раздела в сегменте.
Вы можете проверить информацию о параллельных пакетах (ParallelizationFactor) в https://docs.aws.amazon.com/lambda/latest/dg/with-kinesis.html
Ответ №2:
Похоже, я неправильно решал проблему. Lambda гарантирует, что в сегменте экземпляр Lambda вызывается для одного пакета за раз. Следовательно, нет необходимости в распределенной блокировке, поскольку в худшем случае в одном пакете будет несколько записей, принадлежащих одному объекту, и обработкой их по порядку можно управлять в памяти внутри самой лямбда-функции.
Ссылка из часто задаваемых вопросов AWShttp://aws.amazon.com/lambda/faqs /
Вопрос: Как AWS Lambda обрабатывает данные из потоков Amazon Kinesis и потоков Amazon DynamoDB?
Записи потоков Amazon Kinesis и DynamoDB, отправляемые в вашу функцию AWS Lambda, строго сериализованы для каждого сегмента. Это означает, что если вы поместите две записи в один и тот же сегмент, Lambda гарантирует, что ваша лямбда-функция будет успешно вызвана с первой записью до того, как она будет вызвана со второй записью. Если время ожидания вызова для одной записи истекло, она была заблокирована или произошла какая-либо другая ошибка, Lambda будет повторять попытку до тех пор, пока она не завершится успешно (или запись не достигнет 24-часового срока действия), прежде чем перейти к следующей записи. Упорядочение записей в разных сегментах не гарантируется, и обработка каждого сегмента происходит параллельно.
Комментарии:
1. Вы абсолютно правы, обратите внимание, что в некоторых случаях и конфигурации вы можете потерять порядок, убедитесь, что конфигурация правильная — aws.amazon.com/about-aws/whats-new/2019/11 /…