sql >> データベース >  >> NoSQL >> Redis

AWS Lambda関数からRedisインスタンスに接続するにはどうすればよいですか?

    私は今、自分の問題を解決しました。将来、この問題を経験している人の助けになることを願っています。

    上記のコードでLambda関数から行ったように、データベースに接続する際の2つの主要な考慮事項があります。

    1. 一度context.succeed()context.fail() 、またはcontext.done() と呼ばれる場合、AWSはまだ終了していないプロセスをフリーズする可能性があります。これが、AWSがConnection closedをログに記録する原因でした。 APIエンドポイントへの2回目の呼び出しで、プロセスはRedisが閉じる直前にフリーズし、次の呼び出しで解凍されました。その時点で、中断したところから続行し、接続が閉じられたことを報告しました。要点:データベース接続を閉じる場合は、前に完全に閉じていることを確認してください。 それらのメソッドの1つを呼び出します。これを行うには、接続のクローズ(.on('end')によってトリガーされるイベントハンドラーにコールバックを配置します。 、私の場合)。
    2. コードを別々のファイルに分割し、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
                      })
                    }
                  })
                }
              })
            }
          }
        })
      })
    }
    

    これは正常に機能し、非常に高速です。




    1. ServiceStack Redis、Luaテーブルをリストとして返す方法

    2. Mongodbヘルスチェックステップバイステップ

    3. Express.jsとは何ですか?

    4. MongoDB、配列からオブジェクトを削除します