Выполнять AWS Lambda (с несколькими данными) только после сбора фиксированного объема данных - PullRequest
0 голосов
/ 04 апреля 2019

Я бы хотел выполнить лямбда-функцию с несколькими данными, только после того, как будет собран фиксированный объем данных.Фиксированная сумма будет, например, рассматривать только определенное количество сообщений или сообщений, которые отправляются в определенном временном диапазоне.

Я думал, что решить эту проблему, используя SQS, на котором я пишусообщения, и с помощью опроса, чтобы проверить состояние SQS.Но мне не нравится это решение, потому что я хотел бы запускать лямбду мгновенно, когда критерии соответствуют (например: истекшее время с момента первого отправленного сообщения или фиксированное количество сообщений)

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

Для ясности:

  1. Первое сообщение поступает в очередь
  2. С этого момента запускается таймер (например, 1 минута)
  3. Таймер заканчивается, и он будет запускать лямбда со всеми собранными до сих пор сообщениями

Более того, я бынравится обрабатывать разные очереди параллельно, основываясь на разных идентификаторах

Есть ли элегантный способ сделать это?

У меня уже есть система, которая работает с последовательной лямбда, которая обрабатывает всеобработка одного сообщения

Ответы [ 2 ]

0 голосов
/ 04 апреля 2019

К сожалению, это не простая задача для AWS Lambda (у нас похожий случай использования).

SQS или поток данных Kinesis в качестве триггера могут быть полезны, но имеют несколько ограничений:

  • SQS будет обрабатываться AWS Lambda с очень высокой частотой.Вам нужно будет добавить ограничение на параллелизм к вашей лямбде, чтобы он вызывался более чем одним элементом.Максимальный размер партии - всего 10.

  • Базовая скорость для триггера Kinesis равна одной в секунду для каждого шарда и не может быть изменена.

Агрегирование записей между различными вызовами не является хорошей идеей, потому что вы никогда не знаете, начнется ли следующий вызов для другого контейнера, поэтому они будут потеряны.

Kinesis Firehose может быть полезен,как вы можете настроить максимальный размер партии и максимальный диапазон времени для отправки новой партии.Вы можете настроить его для записи в корзину S3 и настроить лямбду для запуска новых созданных файлов.

Убедитесь, что, если вы используете поток данных Kinesis в качестве источника пожарного шланга Kinesis, данные из каждогоосколок потока данных отдельно помещается в Firehose (это не задокументировано в AWS).

0 голосов
/ 04 апреля 2019

Вы можете сделать это несколькими способами. Я бы сделал это так:

  1. Пусть очередь будет источником событий для лямбда-функции
  2. Эта лямбда-функция может: запускать конечный автомат ИЛИ ничего не делать. Он запускает конечный автомат, если в настоящий момент его нет (то есть мы находимся в этом 1-минутном диапазоне).

Конечный автомат имеет следующие шаги:

  1. 1 минута ожидания
  2. Обрабатывает ли он
...