Информировать клиентов браузера, когда функция Lambda выполняется с использованием Amazon SQS

В моем сценарии я пытаюсь реализовать сервер с меньшим количеством бэкэнд, который выполняет довольно длительные вычисления. Эти вычисления управляются Lambda, что относится к некоторому внешнему API.

Чтобы запросить это, я использую шлюз API Amazon, который имеет ограничение на выполнение в течение 10 секунд. Однако Lambda работает около 100 секунд.

Чтобы избежать этого ограничения, я использую вторую функцию Lambda для выполнения этого трудоемкого вычисления и сообщите, что расчет запущен.

Я очень похожу на это:

var AWS = require('aws-sdk');
var colors = require('colors');

var functionName = 'really-long'

var lambda = new AWS.Lambda({apiVersion: '2015-03-31'});

var params = {
  FunctionName: functionName, 
  InvocationType: 'Event'
};


lambda.invoke(params, function(err, data) {
  if (err) console.log(err, err.stack); // an error occurred
  else     console.log(functionName.green + " was successfully executed and returned:\n" + JSON.stringify(data, null, 2).gray);           // successful response
});

console.log("All done!".rainbow);

Этот код выполняется через AWS API Gateway тысячами клиентских браузеров независимо.

Чтобы сообщить каждому конкретному клиенту, что его выполнение функции Lambda было успешно выполнено, я планировал использовать AWS SQS (из-за длительного опроса и некоторых других полезных функций из коробки).

Итак, мой вопрос:

Как определить на клиенте, какое сообщение в очереди принадлежит этому конкретному клиенту? Или я должен перебирать всю очередь для поиска правильных сообщений с помощью некоторого параметра идентификатора запроса в каждом клиентском браузере? Я предполагаю, что этот метод будет неэффективен, когда 1000 клиентов будут одновременно ждать своих результатов.


Я понимаю, что могу написать результаты в DynamoDB, например, и периодически опросить DB для результата через некоторый домашний API. Но есть ли элегантное решение для уведомления клиента на основе браузера о завершении выполнения временной функции Lambda на основе некоторого решения Amazon PaaS?

Ответ 1

Честно говоря, маршрут DynamoDB, вероятно, лучший выбор. Вы можете создать uuid в первой функции Lambda, выполняемой шлюзом API. Передайте этот uuid длинной функции лямбда. Прежде чем вторая функция завершится, запишите в таблицу DynamoDB две колонки: uuid и result.

Шлюз API отвечает клиенту с созданным им uuid. Затем клиент длительно опросает запрос getItem против вашей таблицы DynamoDB (либо через aws-sdk напрямую, либо через другой запрос шлюза API). После успешного ответа удалите указанный элемент из таблицы DynamoDB.

Ответ 2

Объект контекста лямбда-функции будет иметь идентификатор запроса AWS, возвращенный клиенту, который вызывает функцию лямбда.

Таким образом, у клиента будет ID лямбда-запроса Lambda 1, объект Lambda 1 Context будет иметь тот же идентификатор запроса (независимо от лямбда-попыток, идентификатор запроса остается таким же). Поэтому передайте этот идентификатор запроса Lambda 2 там, где фактический идентификатор запроса привязан до конца.

Опрос с использованием идентификатора запроса от клиента довольно прост в любом хранилище данных, таком как dynamodb.