use*_*707 1 c# amazon-web-services aws-lambda
我想在 C# Lambda 调用之间使用缓存,我知道如果 Lambda 从冷启动,这是不可能的,但如果在短时间内被多次调用,我们可以使用缓存。
我尝试过创建一个静态变量,但这似乎在每次调用后都会重新初始化?
有人有主意吗?下面是一个示例,我希望每次将 TestCache 变量增加 1,但这总是返回 1。
using Amazon.Lambda.APIGatewayEvents;
using Amazon.Lambda.Core;
using System.Collections.Generic;
// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]
namespace MyTestLambda
{
public class Global
{
private readonly Dictionary<string, string> allOriginHeaders = new Dictionary<string, string>
{
{ "Access-Control-Allow-Origin", "*" }
};
public static int TestCache = 0;
public APIGatewayProxyResponse Handler(APIGatewayProxyRequest apigProxyEvent)
{
TestCache += 1;
return new APIGatewayProxyResponse
{
Body = TestCache.ToString(),
StatusCode = 200,
Headers = allOriginHeaders
};
}
}
}
Run Code Online (Sandbox Code Playgroud)
我意识到实际上我的代码确实缓存,但必须创建多个实例。就我而言,我正在负载测试中一次抛出 500 个请求,所有返回的请求都是相同的,但是当我手动进行一项一项测试时,数字确实增加了。根据下面的答案,我将把弹性缓存视为一种更好的方法。
某种形式的缓存可以通过AWS Lambda 执行上下文来实现:
执行 Lambda 函数后,AWS Lambda会在一段时间内维护执行上下文,以等待下一次 Lambda 函数调用。
要使用它,您的变量必须在函数处理程序之外声明:
在函数处理程序方法之外声明的对象保持初始化状态,从而在再次调用函数时提供额外的优化。例如,如果您的 Lambda 函数建立了数据库连接,则在后续调用中将使用原始连接,而不是重新建立连接。
然而,使用执行上下文的问题是,AWS 不提供任何关于可以使用它的时间的保证:
当您编写 Lambda 函数代码时,不要假设AWS Lambda 自动为后续函数调用重用执行上下文。
因此,基于 lambda 执行上下文的缓存解决方案可以发挥作用,但在很多方面都会受到限制。对于正确的缓存解决方案,您必须在 lambda 之外寻找,例如将序列化对象存储在ElastiCache或DynamoDB更多中。
我尝试过创建一个静态变量,但这似乎在每次调用后都会重新初始化?
您尚未提供任何代码,但可能的原因可能是您的变量在函数处理程序中初始化。如上所述,您的对象/变量应该在函数处理程序之外声明才能重用。
| 归档时间: |
|
| 查看次数: |
4213 次 |
| 最近记录: |