我正在尝试使用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)
...
}
1条答案
按热度按时间enyaitl31#
虽然不是完美的解决方案(比如awsrds代理),但是在lambda处理程序之外创建连接池似乎是最好的选择。实际的技术取决于您的语言/环境,因为您还可以延迟初始化连接池并将其保存到类变量、singleton等中
pool
来自lambda处理程序函数中任意位置的变量。查看本文了解更多信息。
aws lambda的处理模型相当简单。只要请求到来(lambda是从api网关、kinesis流等调用的),lambda的生命周期管理代码就会保持lambda的活动状态,因为它会同步地在请求批上循环。当这个单线程解决方案无法跟上传入的处理请求时(通过不断检查一些延迟度量),lambda的lifecyclemanager将创建更多的lambda。因此,在某种意义上,当有很多事情要处理时,您将有一段时间的lambda(s),而这正是您希望对服务器的免费连接保持保守的时候。