带有lambda的redis连接池

s8vozzvw  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(331)

我正在尝试使用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)
  ...
}
enyaitl3

enyaitl31#

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

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

查看本文了解更多信息。
aws lambda的处理模型相当简单。只要请求到来(lambda是从api网关、kinesis流等调用的),lambda的生命周期管理代码就会保持lambda的活动状态,因为它会同步地在请求批上循环。当这个单线程解决方案无法跟上传入的处理请求时(通过不断检查一些延迟度量),lambda的lifecyclemanager将创建更多的lambda。因此,在某种意义上,当有很多事情要处理时,您将有一段时间的lambda(s),而这正是您希望对服务器的免费连接保持保守的时候。

相关问题