AWS Kinesis, параллельная обработка лямбда-кода с гарантированным упорядочением

#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. Если «одновременные пакеты на сегмент» равно 1 (по умолчанию один), то порядок будет сохранен для всего сегмента.
  2. Если значение «одновременные пакеты на сегмент» равно [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 /…