私はAWSラムダ関数として展開したいnode.js functonを持っています。 Redis Elasticacheを使用すると、redis.createClientで開いた接続を閉じるか、ラムダ関数がタイムアウトすることに気付きました。私は単にクライアントのquit()メソッドを呼び出すだけでこれを行います。ラムダコールバックを発行する前にこれを行うと、ラムダ関数は期待どおりに終了します。私がしなければ、ラムダ関数は設定したタイムアウト間隔でタイムアウトします。テスト設定では、私はキャッシュ上で動作し、30ミリ秒で終了するラムダ関数を持っています。 redis client quit()メソッドを呼び出さなければ、同じラムダ関数は1分のタイムアウト前に終了しません。私は確信していませんが、私はラムダ関数がこのように動作すると仮定しています。なぜなら、redis接続がまだアクティブなので関数が(コールバックの後でも)実行されたかどうかわからないからです。ラムダ関数でDAXクライアントを閉じる
quit()メソッドを呼び出すだけで十分であるので、私はこれについて心配しているわけではありません。私が抱えている問題は、DynamoDB DAXクライアントと同様のことをしようとするときです。私は、ラムダ機能に、私のVPCエンドポイントを介して直接DynamoDBにアクセスさせることができ、すべて正常に動作します。 DAXクライアントを使用すると、テーブルへの変更が実際に行われます(アイテムを挿入してそこにあることがわかります)が、ラムダ関数は常にタイムアウトします。ここで
は、いくつかのサンプルコードです:私はちょうどddbClientを使用する場合は
const AmazonDaxClient = require('amazon-dax-client');
const AWS = require('aws-sdk');
const config = require('./config');
AWS.config.update(config.aws);
var ddbClient = new AWS.DynamoDB.DocumentClient(config.dynamodb);
var dax = new AmazonDaxClient(config.dax);
var daxClient = new AWS.DynamoDB.DocumentClient({service: dax });
、すべてが動作します。 daxClientを使用すると、すべてが機能します(挿入、削除、更新など)が、ラムダ関数はタイムアウトします。同じようなquit()メソッドがdaxClientのDAXクラスタに伝えられています。完了したら、すべての接続をきれいに閉じることができますか?この問題は、daxClientが通常のddbClientとまったく同じように動作し、ddbClientにquit()メソッドがないようにすることが問題であると考えられます。
'context.callbackWaitsForEmptyEventLoop = false'を設定しようとすると... DAXとredisの両方のタイムアウトに対処し、これらの接続をそれぞれの関数呼び出しで初期化する必要がないので、処理を少し速くすることができます。 (私はDAXクライアントに精通していませんが、Lambdaは誰かがこのオプションを使わずにソケットを開いたままにしておくのを待っています) –
Michael、それは両方の面でそのトリックを行いました。ありがとう!私が受け入れることができるように答えを書きたいのですか? –