Цепная лямбда-функция против создания асинхронной программы - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть AWS лямбда-функция, написанная в python, которая начинает становиться слишком большой. Он часто превышает AWS лямбда-лимит в 15 минут.

Функция отвечает за загрузку вызовов API, и, к сожалению, я еще не удосужился сделать их все асинхронными c.

Рабочий процесс для функции выглядит примерно так this:

  1. Получение данных для клиентов xxx (1 вызов API)
  2. Выполнение вызова API для каждого клиента и ожидание ответа (вызовы API XXX)
  3. На основе # 2 Ответ на вызов API, сделайте еще один вызов API для каждого клиента и дождитесь ответа (вызовы xxx api)
  4. Сохранить ответ от # 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, но об этом мы можем позаботиться позже).

  1. Каков предпочтительный способ решения этой ситуации с точки зрения архитектуры? Разбивая вещи на лямбда-цепочки или пытаясь ускорить их, используя asyn c внутри одной лямбда-функции?

  2. Если бы мы внедрили лямбда-цепочку, будет ли это больше или менее дорогой в масштабировании по сравнению с асинхронным c подходом с одной функцией?

  3. Есть ли третье конструктивное решение этой проблемы, которое я не рассматривал? (Помимо раскрутки экземпляра EC2, чего я бы предпочел не делать).

1 Ответ

1 голос
/ 17 февраля 2020

Это идеальный случай для Шаг Функции .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...