【问题标题】:Redis connection pool with Lambda使用 Lambda 的 Redis 连接池
【发布时间】:2020-06-20 22:43:37
【问题描述】:

我正在尝试将 Redis 与 lambda 函数一起使用。如果 lamdba 不保持状态,我如何使用连接池。总是让 lambda 与 redis 建立新连接可以吗?或者我可以使用我在下面粘贴的连接池示例吗?在我的 Handle func 中,我将执行 conn := pool.Get()。不知道我应该采取什么方法。任何帮助。

func Handle(ctx context.context, req events.APIGatewayWebsocketProxyRequest)(interface{},error){

  //make new redis connection


}

或

func newPool(addr string) *redis.Pool {
  return &redis.Pool{
    MaxIdle: 3,
    IdleTimeout: 240 * time.Second,
    // Dial or DialContext must be set. When both are set, DialContext takes precedence over Dial.
    Dial: func () (redis.Conn, error) { return redis.Dial("tcp", addr) },
  }
}

var (
  pool *redis.Pool
  redisServer = flag.String("redisServer", ":6379", "")
)

func main() {
  flag.Parse()
  pool = newPool(*redisServer)
  ...
}

【问题讨论】:

  • 使用 Redigo 的池没有任何缺点,如果该进程用于处理多个函数调用,这是一个胜利。
  • “如果 lamdba 不保持状态,我如何使用连接池”你不能。该池将仅用于与该 lambda 实例的连接,并且只会在该实例持续的时间内持续存在,您无法控制这两个实例。不过,我仍然建议在代码中使用连接池;它几乎没有缺点,但有很多潜在的好处。
  • @Adrian- 有什么意义?无论如何,不​​会每次调用 lambda 建立新连接,而不是使用恒定的连接池。如果 lambda 运行的次数超过了连接数限制会怎样?

标签: database go redis aws-lambda


【解决方案1】:

虽然不是完美的解决方案(例如AWS RDS Proxy),但在 lambda 处理程序之外创建连接池似乎是您最好的选择。实际技术取决于您的语言/环境,因为您还可以延迟初始化连接池并将其保存到类变量、单例等。在您的示例中,使用 lambda 处理函数中任何位置的全局 pool 变量。

var (
  pool *redis.Pool
  redisServer = flag.String("redisServer", ":6379", "")
)

func newPool(addr string) *redis.Pool {
  ...
}

func HandleRequest(ctx context.Context, name MyEvent) (string, error) {
  conn := pool.Get()
  defer conn.Close()
  err = conn.Send("ZINCRBY", ...)
  if err != nil {
    return err
  }
  ...
}

func main() {
  flag.Parse()
  pool = newPool(*redisServer)
  lambda.Start(HandleRequest)
}

查看this Redislabs article 了解更多信息。

AWS lambda 的处理模型相当简单。只要请求即将到来(从 API 网关、Kinesis 流等调用 lambda),lambda 的生命周期管理代码就会在 lambda 同步循环处理请求批次时保持其活动状态。当这个单线程解决方案无法跟上传入的处理请求时(通过不断检查一些延迟指标),lambda 的生命周期管理器将创建更多的 lambda。因此,从某种意义上说,当有很多事情要处理时,您的 lambda(s) 会运行一段时间,此时您无论如何都希望对服务器的免费连接保持保守。

【讨论】:

    猜你喜欢
    • 2021-01-01
    • 2014-03-25
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    • 1970-01-01
    • 2016-10-08
    相关资源
    最近更新 更多