Информировать клиентов браузера, когда функция 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.