在本文中,我们不仅将探讨使用Redis
作为REST API的缓存解决方案的好处,而且我还提供了一个实用的示例,说明如何使用AWS Lambda
使用TypeScript
在无服务器环境中实现Redis Caching 2 。我将演示如何使用ElastiCache Redis
调用外部API和缓存响应,从而产生更快的响应时间和提高的可靠性。通过遵循我的示例,您将学习如何将REDIS缓存集成到您自己的无服务器应用程序中。
代码示例
如果您想直接跳入代码样本并在活生物体上播放,则在下面的我的github上可用:
https://github.com/luafanti/elasticache-redis-and-lambda
部署概述
使用云形式模板来提供演示中的基础架构。使用默认参数创建的堆栈将提供以下资源:
- 带有单个公共和私人子网以及其他基本VPC组件的VPC
- nat Gateway
- Elasticache redis
- 打字稿lambda&http api网关
**请注意,堆栈包括即使您有免费tier的组件(nat&redis),这些组件(nat&redis)也会产生每小时的费用。
您还可以在MultiAZ
模式下创建堆栈。然后堆栈将创建:
- VPC有两个公共和两个私人子网
- 2 Nat Gateway,每个私人子网
- 在多AZ模式下的Elasticache Redis-一个主和一个副本实例
- 相同的打字稿lambda
在多AZ模式中,由于NAT和REDIS的两个实例
,将增加一倍安装很简单,
npm install
sam build
sam deploy
删除整个堆栈
sam delete
澄清的重要点
- 如果要连接托管的redis,则需要在VPC内部部署lambda。 Elasticache是一项旨在在VPC内部使用的服务。 此设置中需要
- NAT网关。在VPC中运行的Lambda从未分配公共IP地址,因此它无法连接到VPC以外的任何内容 - 在这种情况下,我们的外部API。 NAT网关解决了这个问题。
- 如果要连接到redis群集,例如在本地CLI中,您必须设置VPN连接或堡垒主机。
- 最高水平等待此lambda样本中没有支持。这是因为实际设置使用
CommonJS
包装。要启用此功能,它需要配置Esbuild以使用.mjs
Extension输出模块文件。
深入
REST API已成为我们系统不可或缺的一部分。 GraphQL
和gRPC
通常在某些方面可以替代老式的休息,但就我个人而言,我仍然无法想象有力避免这种API。无论如何,休息无处不在,在我们的系统中,我们经常以这种方式整合我们的服务。有时是内部API,有时是外部API。在后一种情况下,这更加困难,因为我们无法控制此API的性能和可用性。
外部API的较长响应时间会自动增加我们服务中请求处理的总体时间。外部API的不可用,甚至更多,会影响我们的应用程序,并需要特殊处理。对所有这些邪恶的解毒剂可能是额外的缓存...这是Redis进入游戏的地方。
为什么要重新作为缓存?
REDIS的主要原因是其高性能。 REDIS被认为是更快的密钥值数据库之一。这种效率背后有几个原因:
- 基于RAM的数据存储。 RAM访问比HDD甚至SSD访问快几个数量级。更不用说API的访问权限了,这是负担最高的延迟。
- 有效的数据结构。 REDIS提供了各种数据结构,例如列表,集合,哈希,位图等。所有类型均在C中实现,用于分配内存使用自定义包装器,用于称为zmalloc的Malloc。这允许Redis根据需求选择不同的同种库。
- 事件驱动的体系结构。 redis使用反应堆设计模式多路复用I/O,同时仅使用一个线程来处理数千个传入请求。
在AWS的情况下,其他原因是REDIS数据库可在此处以托管服务-ElastiCache Redis提供。它简化了配置和维护,并将某些责任转移到了提供商。
逐步的缓存流
流程非常简单。.ProxyLambda
首先检查了缓存中外部API的响应是否存在。作为此简单示例中的缓存键,我也只使用查询参数的完整请求路径。在复杂的API中,我可以推荐一个更先进的关键生成策略。如果响应对象存在于Redis缓存中,则Lambda将直接返回。否则,Lambda像以前一样调用外部API,但还保存了对Redis Cache的响应。因此,将随后向ProxyLambda
的请求提供相同的资源,将从缓存返回,而不是调用外部API。
基本上,下面的两个图应解释全部
仍然存在有关缓存中记录无效的问题。在这里,策略必须符合要求。在此演示中,缓存中的对象是永恒的。解决方案之一是在保存(redis.setEx(cacheKey, 86400, apiResponse
)上进行硬码到期时间。一种更优雅的方法是创建专用的无效lambda,当收到外部API中某些资源已被删除或修改的事件时,它将从缓存中删除对象。
解决方案的利弊
¢表现更好。 REDIS缓存的响应比外部API的速度要快得多。延迟也稳定,不依赖当前的API负载。
¢提高了可靠性。即使外部API降低,我们面对的API也可以做出响应。
ð¢在外部API上的负载减少,因为请求较少。
ðâ€额外的管理和维护弹性。
ðâ€