Вот упрощенная схема, которую я пытаюсь сделать:
http-запросы → (API шлюза + лямбда A) → SQS → (лямбда B ) → DynamoDB
Таким образом, он должен работать, как показано: данные, поступающие из многих HTTP-запросов (например, до 500 в секунду) помещается в очередь SQS по моей лямбда-функции A. Затем другая функция B обрабатывает очередь: считывает до 10 элементов (на некоторой периодической основе) и записывает их в DynamoDB с BatchWriteItem.
Проблема в том, что я не могу понять, как запустить вторую лямбда-функцию. Его нужно вызывать часто, несколько раз в секунду (или, по крайней мере, один раз в секунду), потому что мне нужны все данные из очереди, чтобы попасть в DynamoDB ASAP (что почему вызов лямбда-функции B через запланированные события, как описано здесь не является вариантом)
Почему я не хочу писать напрямую в DynamoDB без SQS?
Мне было бы здорово избежать использования SQS. Проблема, с которой я пытаюсь обратиться в SQS, - это демпфирование DynamoDB. Даже не дросселируйте себя, а обрабатывайте его, записывая данные в DynamoDB с помощью AWS SDK: при записи записей один за другим и их дросселировании AWS SDK молча повторяет запись, что приводит к увеличению времени обработки запроса с точки http-клиента вид.
Итак, я хотел бы временно сохранить данные в очереди, отправить ответ "200 OK" обратно клиенту, а затем получить очередь, обрабатываемую отдельной функцией, запись нескольких записей одним вызовом DynamoDB BatchWriteItem (который возвращает необработанные элементы вместо автоматического повтора в случае дросселирования). Я даже предпочел бы потерять несколько записей вместо увеличения задержки между принимаемой записью и сохранением в DynamoDB Забастовкa >
UPD: Если кому-то интересно, я нашел способ сделать aws-sdk пропустить автоматические повторы в случае дросселирования: есть специальный параметр maxRetries. Во всяком случае, собирается использовать Кинезис, как предложено ниже