В моем сценарии я пытаюсь реализовать сервер с меньшим количеством бэкэнд, который выполняет довольно длительные вычисления. Эти вычисления управляются 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?