2015-10-20 12 views
10

W moim scenariuszu próbuję zaimplementować serwer bez serwera zaplecza, który wykonuje dość długo czasochłonne obliczenia. Te obliczenia są zarządzane przez Lambda, która odnosi się do zewnętrznego interfejsu API.Poinformuj klientów przeglądarki, gdy funkcja Lambda jest wykonywana przy użyciu Amazon SQS

W celu żądania tego używam usługi Amazon API Gateway, która ma 10 sekund ograniczenia wykonania. Jednak Lambda działa około 100 sekund.

Aby uniknąć tego ograniczenia, używam drugiej funkcji Lambda do wykonania tych czasochłonnych obliczeń & raport, że obliczenia zostały rozpoczęte.

I wygląda bardzo podobnie do tego:

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); 

Ten kod jest wykonywany przez AWS API bramki przez tysiące klientów przeglądarek niezależnie od siebie.

Aby poinformować każdego klienta o pomyślnym wykonaniu jego funkcji Lambda, planowałem użyć AWS SQS (z powodu długiego odpytywania i innych użytecznych funkcji po wyjęciu z pudełka).

Więc moje pytanie brzmi::

Jak mogę określić, na kliencie, który komunikat w kolejce należącym do tego konkretnego klienta? Czy powinienem powtórzyć całą kolejkę, aby znaleźć odpowiednie komunikaty za pomocą jakiegoś parametru identyfikatora żądania w każdej przeglądarce klienta? Sądzę, że ta metoda będzie nieskuteczna, gdy 1000 klientów będzie jednocześnie oczekiwać na wyniki.


Rozumiem, że mogę na przykład pisać wyniki dla DynamoDB i okresowo odpytywać DB dla wyniku przez niektóre domowe API. Ale jest jakieś eleganckie rozwiązanie powiadamiające klienta przeglądarkowego o zakończeniu wykonywania czasochłonnej funkcji Lambda w oparciu o niektóre rozwiązania Amazon PaaS?

Odpowiedz

3

Szczerze mówiąc, trasa DynamoDB jest prawdopodobnie najlepsza. Możesz wygenerować uuid w pierwszej funkcji Lambda wykonywanej przez bramkę API. Pomiń to na długo działającą funkcję Lambda. Przed zakończeniem drugiej funkcji należy ją zapisać w tabeli DynamoDB z dwiema kolumnami: uuid i result.

Bramka interfejsu API odpowiada na klienta z wygenerowanym przez niego uuidem. Następnie klient przesłuchuje za pomocą żądania getItem przy użyciu tabeli DynamoDB (za pośrednictwem aws-sdk bezpośrednio lub za pośrednictwem innej prośby o bramę interfejsu API). Po pomyślnej odpowiedzi usuń przedmiot ze stołu DynamoDB.

1

Obiekt kontekstu funkcji lambda będzie miał identyfikator żądania AWS zwrócony klientowi, który wywołał funkcję Lambda.

Tak, klient będzie miał identyfikator żądania lambda Lambda 1, Lambda 1 obiekt kontekstu będzie miał ten sam identyfikator wniosku (niezależnie od prób lambda, identyfikator żądania pozostaje taki sam). Tak więc podaj ten identyfikator żądania do Lambda 2 przez faktyczny identyfikator żądania jest powiązany do końca.

Sondowanie za pomocą identyfikatora żądania od klienta jest dość łatwe w przypadku dowolnego magazynu danych, takiego jak dynamodb.

Powiązane problemy