如果您熟悉lambda执行环境及其在单个lambda函数调用中的工作原理,那么它应该始终是您的首要任务,可以使用它来通过坚持和重复使用DB连接来优化应用程序的性能,尤其是在情况下延迟必须考虑到。
ð Lambda Execution Environment
最近,我实施了一种解决方案,用于重复使用RAMBDA函数在运行时环境中的REDIS客户端连接,我将在今天在这里分享。
请注意,使用Typescript和
给出了示例 此博客甚至可以帮助您重复使用数据库连接(MySQL,PostgreSQL等)。
1.利用lambda静态初始化
仅当第一次旋转执行环境时,才能运行函数主处理程序方法之外的代码。 Lambda只要环境温暖就可以保留该代码。
ð Static Initialization
- 在处理程序方法之外初始化一个保存REDIS客户端对象的全局变量。
您可以根据函数的代码结构将此全局redis client变量放在任何文件中。它不必将其保存在处理程序方法文件中。
2. REDIS/数据库中的设置空闲连接超时
由于,我们要重复使用数据库连接,因此无需结束新创建的连接。
- 因此,从您的lambda函数中删除Close Conneciton逻辑。仅在您要重复使用现有连接的情况下才能为低潜伏期或更好的整体吞吐量重复使用。
一旦删除了lambda执行环境,这些打开的连接就变得毫无用处。它们可以占据尽可能多的内存,从而导致 出现记忆 错误。
-
在redis中配置空闲的连接超时。(或在您的数据库服务中)自动终止这些空闲连接。
您需要在这里小心,分析您的应用程序要求并根据需要配置REDIS的超时。
它不应大于lambda执行环境闲置超时。我在网上发现,它在40-50分钟之间,但没有适当的证据。您可能想执行测试以自己找到:)
另外,它不应该同时很小,否则,您的lambda功能可能会与以前的速率匹配,并且整个工作变得毫无意义。 em>
3.更新Redis客户端创建逻辑
您需要根据2件事更新客户端创建逻辑,当您要重置全局redis客户端时?(上面显示的redisClient
var)以及您要重复使用它吗?
有多种管理方法:
- 创建一个称为
getRedisClient()
的单独方法,如下图所示。将客户端重复使用/重置逻辑保留在该方法中,仅在整个lambda函数中使用它来获取活动的Redis客户端。 这种方法更清洁且可维护。如果您的应用程序可以带有额外的ping()
调用,那么这是一个很好的解决方案。 - 在这里,将客户端重置逻辑移动到如下所示的API方法中。它可以为您节省
ping()
呼叫,因此更具性能。 当您的lambda功能仅执行一个任务时,此方法是有利的。如果您的功能中有多个业务逻辑操作,那么也许不是一个不错的选择。您将必须在执行REDIS操作的所有方法中插入客户端重置逻辑。对清洁代码原则不利。 - 实现全局误导者或类似的模式,用于传输所有错误的lambda函数。将客户端重置逻辑移动到(不重用逻辑),就像我们在第二种方法中所做的那样。这看起来像是一个完美的解决方案,避免了第二种方法中第一种方法和重复模式的
ping()
调用。
我根据我的应用程序的需求亲自使用了第一种方法。第三种选择只是一个启动,我自己没有自己实施,现在没有额外的时间来研究和实施错误处理程序¥²,也许您可以尝试一下,让我知道ð
更新Redis客户端创建逻辑后,您的lambda函数都将重复使用旧连接ð。