非同期にAPI呼び出しを行い、データを返す単純なラムダ関数があります。これは99%の確率で機能します。APIがラムダ構成のタイムアウトよりも長くかかると、予想どおりエラーが発生します。今問題は、ラムダ関数への後続の呼び出しを行うと、永続的にタイムアウトエラーが発生することです。
"errorMessage": "2016-05-14T22:52:07.247Z {session} Task timed out after 3.00 seconds"
これが事実であることをテストするために、ラムダタイムアウトを3秒に設定し、ラムダ内でこれら2つの関数をトリガーする方法を用意しました。
Javascript
function now() {
return response.tell('success');
}
function wait() {
setTimeout(function() { return response.tell('success'); }, 4000);
}
now
関数を呼び出しても問題ありません。wait
関数を呼び出すと、タイムアウトエラーが発生し、その後の呼び出しでnow
同じエラーが発生します。
これは予想される動作ですか?ラムダ関数への後続の呼び出しはすべて機能するはずだと思います。私はいつでも構成タイムアウトを増やすことができることを理解していますが、そうではありません。
特定の関数ハンドルがどのように機能するかを調べる必要がありますcontext.callbackWaitsForEmptyEventLoop
そのboolean-typeがのfalse
場合、以前にラムダ呼び出しに応答/処理した可能性があるため、setTimeoutは起動されません。しかし、の値callbackWaitsForEmptyEventLoop
がtrue
-の場合、コードはあなたが探していることを実行します。
また、「手書きの」タイムアウト、構成タイムアウトの変更などを必要とせずに、コールバックを介してすべてを直接処理する方がおそらく簡単です...
例えば
function doneFactory(cb) { // closure factory returning a callback function which knows about res (response)
return function(err, res) {
if (err) {
return cb(JSON.stringify(err));
}
return cb(null, res);
};
}
// you're going to call this Lambda function from your code
exports.handle = function(event, context, handleCallback) {
// allows for using callbacks as finish/error-handlers
context.callbackWaitsForEmptyEventLoop = false;
doSomeAsyncWork(event, context, doneFactory(handleCallback));
};
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加