2015-10-20 10 views
10

私のシナリオでは、かなり長い時間を消費する計算を実行するサーバーの少ないバックエンドを実装しようとしています。この計算は、いくつかの外部APIを参照するLambdaによって管理されます。Amazon SQSを使用してラムダ機能が完了したときにブラウザクライアントに通知する

これをリクエストするには、Amazon API Gatewayを使用していますが、これには10秒の実行制限があります。しかし、ラムダは約100秒走る。

このような制限を回避するために、私はこの第2ラムダ関数を使ってこの計算に時間がかかる計算を実行しています&計算が開始されたという報告です。

私はこれと非常によく似ています:

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ゲートウェイ上で実行されます。

ラムダ関数の実行が正常に完了したことを各クライアントに通知するために、AWS SQSを使用する予定でした(長いポーリングとその他の便利な機能が用意されているため)。

だから私の質問はです:

私は、この特定のクライアントに属しているキュー内のメッセージクライアント上で決定することができますどのように?または、すべてのキューを繰り返して、すべてのクライアントブラウザのリクエストIDパラメータによって適切なメッセージを見つける必要がありますか?私は、1000クライアントが同時に結果を待っているときに、この方法が非効率になると思います。


私は、たとえばDynamoDBのに結果を書き込み、定期的にいくつかの手作りのAPIを経由して結果をDBにポーリングできることを理解してください。しかし、には、ブラウザベースのクライアントに、Amazon PaaSソリューションに基づいて時間のかかるラムダ関数の実行の完了を通知するための洗練されたソリューションがありますか?

答えて

3

正直なところ、DynamoDBのルートがおそらく最適です。 APIゲートウェイによって実行される最初のラムダ関数でuuidを生成できます。そのuuidをlong-running Lambda関数に渡します。 2番目の関数が完了する前に、2つのカラム、uuidおよびresultを持つDynamoDBテーブルに書き込みます。

APIゲートウェイは、生成されたuuidをクライアントに返します。クライアントは、getItem要求をDynamoDBテーブルに対して(aws-sdk経由で直接または別のAPIゲートウェイ要求を介して)ロングポーリングします。正常に応答すると、DynamoDBテーブルからその項目を削除します。

1

ラムダ関数のコンテキストオブジェクトは、ラムダ関数を呼び出したクライアントに返されたAWS要求IDを持ちます。

したがって、クライアントはラムダ1のラムダ要求IDを持ちます。ラムダ1コンテキストオブジェクトは同じ要求IDを持ちます(ラムダのリトライに関係なく、要求IDは同じままです)。したがって、このリクエストIDをラムダ2に渡すには、実際のリクエストIDが最後まで連鎖されます。

クライアントからのリクエストIDを使用したポーリングは、dynamodbのようなデータストアでは簡単です。

関連する問題