Длинный звонок на aws API-шлюз - PullRequest
0 голосов
/ 10 января 2020

У меня проблема в следующем.

В настоящее время у меня работает система. NET. Эта система выполняет вызов в службу, которая занимает приблизительно 1 минуту.

В настоящее время мы переносим решение на AWS. И проблема, которую я обнаружил, состоит в том, что Lambda работает работает за 1 минуту (так как он делает вызов другой системе, который занимает 1 минуту), и все работает нормально. Но когда я звоню из Gateway API, у меня есть тайм-аут. В ходе расследования я обнаружил, что максимальный тайм-аут составляет 29 секунд.

Затем мне нужно узнать, какое решение я могу решить для этой проблемы, учитывая, что мне нужно подождать 1 минуту для лямбда-функции.

Мне пришло в голову инициировать вызов из API, запустить лямбда-функцию и создать клиентский пул для просмотра состояния транзакции. Но я не знаю, как сохранить первоначальный вызов «в памяти», и когда я снова вызываю API для просмотра статуса, я знаю, что говорю об одном и том же запросе, чтобы получить данные результата

1 Ответ

1 голос
/ 10 января 2020

Вот схема одного из способов решения этой проблемы:

  • клиент делает /start запрос API, который запускает Lambda # 1
  • Lambda # 1, недолговечен и выполняет следующие действия:
    • генерирует UUID в качестве коррелятора для задачи, которую предстоит выполнить
    • создает новый элемент в DynamoDB, с UUID в качестве ключа
    • запускает длительная (1 минута) лямбда # 2 для запуска, передавая ее UUID
    • возвращает UUID клиенту
  • Lambda # 2 является долгоживущей и делает следующее:
    • независимо от того, какая работа ему необходима,
    • периодически обновляет свой статус и приводит к элементу UUID в DynamoDB
  • , клиент может опросить /status?id=UUID API, по любому графику, который ему нравится, что запускает Lambda # 3
  • Lambda # 3 недолговечно и выполняет следующие действия:
    • запрашивает элемент UUID из DynamoDB
    • вернуть текущее состояние и любые результаты клиенту

Когда т Вызов API /status?id=UUID указывает, что долгоживущая задача выполнена (или не выполнена), клиент может сделать окончательный запрос API, чтобы указать, что у него есть результат, связанный с UUID, и элемент DynamoDB может быть удален, или вы можете просто внедрите TTL для элемента DynamoDB.

Этот процесс выглядит сложным, но на самом деле это не так.

Вместо того, чтобы клиент опрашивал серверную часть о состоянии и результатах, он мог бы поочередно опросить Очередь SQS за тем же или подписывайтесь на SNS topi c.

...