私は今、自分の問題を解決しました。将来、この問題を経験している人の助けになることを願っています。
上記のコードでLambda関数から行ったように、データベースに接続する際の2つの主要な考慮事項があります。
- 一度
context.succeed()
、context.fail()
、またはcontext.done()
と呼ばれる場合、AWSはまだ終了していないプロセスをフリーズする可能性があります。これが、AWSがConnection closed
をログに記録する原因でした。 APIエンドポイントへの2回目の呼び出しで、プロセスはRedisが閉じる直前にフリーズし、次の呼び出しで解凍されました。その時点で、中断したところから続行し、接続が閉じられたことを報告しました。要点:データベース接続を閉じる場合は、前に完全に閉じていることを確認してください。 それらのメソッドの1つを呼び出します。これを行うには、接続のクローズ(.on('end')
によってトリガーされるイベントハンドラーにコールバックを配置します。 、私の場合)。 - コードを別々のファイルに分割し、
require
する場合 私が行ったように、各ファイルの先頭にあるそれらは、Amazonがそれらのモジュールをできるだけ多くメモリにキャッシュします。それが問題を引き起こしている場合は、require()
を移動してみてください ファイルの先頭ではなく関数内で呼び出し、その関数をエクスポートします。これらのモジュールは、関数が実行されるたびに再インポートされます。
これが私の更新されたコードです。また、Redis構成を別のファイルに入れているので、コードを複製せずに他のLambda関数にインポートできることに注意してください。
イベントハンドラー
'use strict'
const lib = require('../lib/related')
module.exports.handler = function (event, context) {
lib.respond(event, (err, res) => {
if (err) {
return context.fail(err)
} else {
return context.succeed(res)
}
})
}
Redisの構成
module.exports = () => {
const redis = require('redis')
const jsonify = require('redis-jsonify')
const redisOptions = {
host: process.env.REDIS_URL,
port: process.env.REDIS_PORT,
password: process.env.REDIS_PASS
}
return jsonify(redis.createClient(redisOptions))
}
機能
'use strict'
const rt = require('./ritetag')
module.exports.respond = function (event, callback) {
const redis = require('./redis')()
const tag = event.hashtag.replace(/^#/, '')
const key = 'related:' + tag
let error, response
redis.on('end', () => {
callback(error, response)
})
redis.on('ready', function () {
redis.get(key, (err, res) => {
if (err) {
redis.quit(() => {
error = err
})
} else {
if (res) {
// Tag is found in Redis, so send results directly.
redis.quit(() => {
response = res
})
} else {
// Tag is not yet in Redis, so query Ritetag.
rt.hashtagDirectory(tag, (err, res) => {
if (err) {
redis.quit(() => {
error = err
})
} else {
redis.set(key, res, (err) => {
if (err) {
redis.quit(() => {
error = err
})
} else {
redis.quit(() => {
response = res
})
}
})
}
})
}
}
})
})
}
これは正常に機能し、非常に高速です。