Мне нужно обработать данные из потока AWS Kinesis, который собирает события с устройств. Функция обработки должна вызываться каждую секунду со всеми событиями, полученными за последние 10 секунд.
Скажем, у меня есть два устройства A и B, которые записывают события в поток. Моя процедура называется MyFunction и принимает следующие параметры:
- Идентификатор устройства
- Массив данных за период
Если я начинаю обработку в 10:00:00 (и уже накопил события для устройств A и B за последние 10 секунд), мне нужно сделать два вызова:
- MyFunction (А, {События для устройства А с 09:59:50 до 10:00:00})
- MyFunction (B, {События для устройства B с 09:59:50 до 10:00:00})
В следующую секунду, в 10:00:01
- MyFunction (А, {События для устройства А с 09:59:51 до 10:00:01})
- MyFunction (B, {События для устройства B с 09:59:51 до 10:00:01})
и так далее.
Похоже, самый простой способ накопить все данные, полученные от устройств, - это просто сохранить их в памяти во временном буфере (конечно, только за последние 10 секунд), поэтому я хотел бы сначала попробовать это.
И наиболее удобный способ сохранить такой буфер на основе памяти, который я нашел, - это создать приложение на основе клиентской библиотеки Java Kinesis (KCL).
Я также рассматривал решение на основе AWS Lambda, но похоже, что невозможно сохранить данные в памяти для лямбда. Другой вариант для Lambda - иметь 2 функции: первая должна записывать все данные в DynamoDB, а вторая вызывается каждую секунду для обработки данных, полученных из базы данных, а не из памяти. (Так что этот вариант намного сложнее)
Итак, у меня такой вопрос: какие могут быть другие варианты реализации такой обработки?