У меня есть AWS лямбда-функция, написанная в python, которая начинает становиться слишком большой. Он часто превышает AWS лямбда-лимит в 15 минут.
Функция отвечает за загрузку вызовов API, и, к сожалению, я еще не удосужился сделать их все асинхронными c.
Рабочий процесс для функции выглядит примерно так this:
- Получение данных для клиентов xxx (1 вызов API)
- Выполнение вызова API для каждого клиента и ожидание ответа (вызовы API XXX)
- На основе # 2 Ответ на вызов API, сделайте еще один вызов API для каждого клиента и дождитесь ответа (вызовы xxx api)
- Сохранить ответ от # 3 в DynamoDB (обновления DB для xxx)
Первоначально я планировал просто сохранить все в одной лямбда-функции и изменить мой код так, чтобы все вызовы API выполнялись asyn c, и в конце выполнить одно большое пакетное обновление DynamoDB.
Однако это происходит Мне кажется, что теоретически эта функция все еще может стать слишком большой в будущем, если мы начнем использовать ее для огромного числа клиентов. Кроме того, по моему мнению, управление всеми этими python asyn c вызовами может быть немного громоздким в определенных c ситуациях.
Мой второй подход заключается в объединении лямбда-функций в цепочку. То есть создайте вторую лямбда-функцию, назовем ее «order_for_single_client», которая выполняет шаги № 2-4 только для одного клиента.
Лямбда-функция верхнего уровня будет собирать данные обо всех клиентах и для каждого из них. , сделайте отдельный лямбда-вызов для "order_for_single_client". Итак, если нам нужно заказать 500 клиентов, функция верхнего уровня просто сделает 500 отдельных лямбда-вызовов. Естественно, все поведение asyn c должно позаботиться о себе в конце AWS, так как оно будет запускать лямбда-функции параллельно. (за исключением требуемого нами пакетного обновления DynamoDB, но об этом мы можем позаботиться позже).
Каков предпочтительный способ решения этой ситуации с точки зрения архитектуры? Разбивая вещи на лямбда-цепочки или пытаясь ускорить их, используя asyn c внутри одной лямбда-функции?
Если бы мы внедрили лямбда-цепочку, будет ли это больше или менее дорогой в масштабировании по сравнению с асинхронным c подходом с одной функцией?
Есть ли третье конструктивное решение этой проблемы, которое я не рассматривал? (Помимо раскрутки экземпляра EC2, чего я бы предпочел не делать).