Redis
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> Redis

Làm cách nào để kết nối với một phiên bản Redis từ một hàm AWS Lambda?

Hiện tôi đã giải quyết được vấn đề của riêng mình và tôi hy vọng tôi có thể giúp được ai đó đang gặp vấn đề này trong tương lai.

Có hai lưu ý chính khi kết nối với cơ sở dữ liệu như tôi đã làm trong đoạn mã trên từ một hàm Lambda:

  1. Sau khi context.succeed() , context.fail() hoặc context.done() được gọi là AWS có thể đóng băng bất kỳ quy trình nào chưa kết thúc. Đây là nguyên nhân khiến AWS ghi nhật ký Connection closed trong lần gọi thứ hai tới điểm cuối API của tôi — quá trình bị đóng băng ngay trước khi Redis đóng xong, sau đó tan băng trong lần gọi tiếp theo, tại thời điểm đó, nó tiếp tục ngay tại nơi dừng lại, báo cáo rằng kết nối đã bị đóng. Bài học rút ra:nếu bạn muốn đóng kết nối cơ sở dữ liệu của mình, hãy đảm bảo rằng nó đã đóng hoàn toàn trước khi bạn gọi một trong những phương pháp đó. Bạn có thể thực hiện việc này bằng cách đặt một lệnh gọi lại trong một trình xử lý sự kiện được kích hoạt bởi một kết nối đóng (.on('end') , trong trường hợp của tôi).
  2. Nếu bạn chia mã của mình thành các tệp riêng biệt và require chúng ở đầu mỗi tệp, giống như tôi đã làm, Amazon sẽ lưu vào bộ nhớ càng nhiều mô-đun đó càng tốt. Nếu điều đó gây ra sự cố, hãy thử di chuyển require() gọi bên trong một hàm thay vì ở đầu tệp, sau đó xuất hàm đó. Sau đó, các mô-đun đó sẽ được nhập lại bất cứ khi nào chức năng này được chạy.

Đây là mã cập nhật của tôi. Lưu ý rằng tôi cũng đã đặt cấu hình Redis của mình vào một tệp riêng biệt, vì vậy tôi có thể nhập cấu hình đó vào các hàm Lambda khác mà không cần sao chép mã.

Trình xử lý sự kiện

'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)
    }
  })
}

Cấu hình 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))
}

Chức năng

'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
                  })
                }
              })
            }
          })
        }
      }
    })
  })
}

Điều này hoạt động chính xác như nó cần - và nó cũng rất nhanh.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Điều kiện làm việc của Sidekiq

  2. Kiểm soát sự cố luồng với nút / redis và gọi lại?

  3. Bộ nhớ cache của Azure Redis - hết thời gian chờ đối với các cuộc gọi GET

  4. Hết thời gian cấp tốc và phiên làm lại

  5. Hàng đợi Redis với xác nhận quyền sở hữu hết hạn