AWS DynamodB Stream Лямбда обрабатывает слишком быстро - PullRequest
0 голосов
/ 01 марта 2019

У меня есть таблица DynamoDb, в которую я отправляю данные, есть поток, который обрабатывается лямбда-выражением, который собирает некоторые статистические данные и вставляет их обратно в таблицу.

Моя проблема в том, что моя лямбдаобрабатывает события слишком быстро, поэтому почти каждая вставка отправляется обратно в таблицу динамо, а вставка их обратно в таблицу динамо вызывает удушение.

Мне нужно замедлить лямбду!

Я установил для моего параллелизма значение 1

Я думал о том, чтобы просто вставить оператор сна в лямбда-код, но это будет оплачиваемое время.

Могу ли я отложить лямбду только для запускаодин раз каждые х минут?

Ответы [ 4 ]

0 голосов
/ 28 июня 2019

Вместо того, чтобы устанавливать задержку или устанавливать параллелизм на 1, вы можете сделать следующее:

  1. Увеличить размер пакета, чтобы обрабатывать несколько событий вместе.Это приведет к некоторой задержке, а также будет стоить меньше денег.
  2. Вместо того, чтобы возвращать данные в DynamodB, перенесите их в другое хранилище, в котором вы не платите wcu, а по количеству используемой памяти / оперативной памяти.
  3. Иметь лямбду, запускаемую облачными часами, которая берет данные из этого временного хранилища и возвращает их в Dynamodb.

Это точно обеспечит несколько вещей,

  1. Вы можете контролировать отставание от агрегированных данных.(т. е. у вас может быть определено 2 стратегии, скажем, 15 минут или 1000 событий, в зависимости от того, что наступит раньше)
  2. Вам не придется отказываться от событий, когда вы очень часто пишете агрегированные данные.(эта проблема будет там, даже если вы используете sqs).
0 голосов
/ 01 марта 2019

Нет, к сожалению, вы не можете сделать это.

Установка параллелизма в 1 определенно поможет, но не решит.Вместо этого вы могли бы немного увеличить RCU, чтобы предотвратить удушение.

Чтобы обойти проблему, подход @ bwest кажется очень хорошим.Я бы пошел с этим.

0 голосов
/ 01 марта 2019

Я никогда не пробовал это сам, но думаю, вы могли бы сделать следующее:

Поместить очередь задержки между потоком и вашей лямбдой.

То естьу вас будет новая лямбда-функция, просто отправляющая события из потока DDB в эту очередь SQS.Вы можете установить задержку до 15 минут в очереди.Затем настройте исходную лямбду на запуск сообщений в этой очереди.Будьте различны SQS пределы хотя.

0 голосов
/ 01 марта 2019

Вы не можете легко ограничить частоту запуска Lambda, но вы можете немного изменить архитектуру и использовать запланированное CloudWatch Event в качестве триггера вместо вашего потока DynamoDB.Затем вы можете запускать лямбду каждые x минут, сопоставлять статистику для записей, добавленных с момента последнего запуска, и помещать их в таблицу.

...