2015-10-20 12 views
10

Nel mio scenario sto cercando di implementare il server meno backend che esegue calcoli che richiedono molto tempo. Questo calcolo è gestito da Lambda che fa riferimento ad alcune API esterne.Informa i client del browser quando la funzione Lambda viene eseguita utilizzando Amazon SQS

In caso di richiesta, sto utilizzando Amazon API Gateway che ha una limitazione di esecuzione di 10 secondi. Tuttavia Lambda corre circa 100 secondi.

Per evitare questa limitazione, sto utilizzando la 2a funzione Lambda per eseguire questo calcolo che richiede tempo & segnala che il calcolo è stato avviato.

mi sembra molto simile a questo:

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

Questo codice viene eseguito su AWS gateway API da migliaia di clienti browser in modo indipendente.

Per informare ogni singolo cliente che la sua esecuzione della funzione Lambda è stata eseguita correttamente, mi sono proposto di utilizzare AWS SQS (a causa del polling lungo e alcune altre utili funzionalità fuori dalla scatola).

Quindi la mia domanda è:

Come è possibile determinare sul client, che messaggio nella coda appartiene a questo particolare cliente? O dovrei scorrere tutte le code per trovare i messaggi corretti con qualche parametro ID richiesta in ogni browser client? Immagino che questo metodo sarà inefficiente quando 1000 client saranno contemporaneamente in attesa dei loro risultati.


capisco che posso scrivere i risultati al DynamoDB ad esempio e periodicamente il polling DB per il risultato tramite alcune API fatta in casa. Ma c'è una soluzione elegante per notificare al client basato sul browser il completamento dell'esecuzione della funzione Lambda che richiede tempo basata su una soluzione Amazon PaaS?

risposta

3

Onestamente, la rotta DynamoDB è probabilmente la soluzione migliore. È possibile generare un uuid nella prima funzione Lambda eseguita dal gateway API. Passa alla funzione Lambda di lunga durata. Prima che la seconda funzione venga completata, scrivere su una tabella DynamoDB con due colonne: uuid e result.

Il gateway API risponde al client con l'uuid generato. Il client esegue quindi sondaggi lunghi con una richiesta getItem rispetto alla tabella DynamoDB (tramite aws-sdk direttamente o tramite un'altra richiesta gateway API). Una volta che ha risposto correttamente, rimuovere detto oggetto dalla tabella DynamoDB.

1

L'oggetto contesto della funzione lambda restituirà l'ID di richiesta AWS al client che ha richiamato la funzione Lambda.

Quindi, il client avrà l'ID di richiesta lambda di Lambda 1, oggetto di contesto Lambda 1 avrà lo stesso ID di richiesta (indipendentemente dai tentativi di lambda, l'ID di richiesta rimane lo stesso). Quindi, passare l'ID di richiesta a Lambda 2 da ID di richiesta effettiva è incatenato fino alla fine.

Il polling utilizzando l'ID richiesta dal client è abbastanza semplice su qualsiasi archivio dati come dynamodb.

Problemi correlati