带有Elasticache Redis&AWS lambda的API缓存
#lambda #redis #elasticache #caching

在本文中,我们不仅将探讨使用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已成为我们系统不可或缺的一部分。 GraphQLgRPC通常在某些方面可以替代老式的休息,但就我个人而言,我仍然无法想象有力避免这种API。无论如何,休息无处不在,在我们的系统中,我们经常以这种方式整合我们的服务。有时是内部API,有时是外部API。在后一种情况下,这更加困难,因为我们无法控制此API的性能和可用性。

外部API的较长响应时间会自动增加我们服务中请求处理的总体时间。外部API的不可用,甚至更多,会影响我们的应用程序,并需要特殊处理。对所有这些邪恶的解毒剂可能是额外的缓存...这是Redis进入游戏的地方。

为什么要重新作为缓存?

REDIS的主要原因是其高性能。 REDIS被认为是更快的密钥值数据库之一。这种效率背后有几个原因:

  • 基于RAM的数据存储。 RAM访问比HDD甚至SSD访问快几个数量级。更不用说API的访问权限了,这是负担最高的延迟。

Redis data access pyramid

  • 有效的数据结构。 REDIS提供了各种数据结构,例如列表,集合,哈希,位图等。所有类型均在C中实现,用于分配内存使用自定义包装器,用于称为zmalloc的Malloc。这允许Redis根据需求选择不同的同种库。
  • 事件驱动的体系结构。 redis使用反应堆设计模式多路复用I/O,同时仅使用一个线程来处理数千个传入请求。

在AWS的情况下,其他原因是REDIS数据库可在此处以托管服务-ElastiCache Redis提供。它简化了配置和维护,并将某些责任转移到了提供商。

逐步的缓存流

流程非常简单。.ProxyLambda首先检查了缓存中外部API的响应是否存在。作为此简单示例中的缓存键,我也只使用查询参数的完整请求路径。在复杂的API中,我可以推荐一个更先进的关键生成策略。如果响应对象存在于Redis缓存中,则Lambda将直接返回。否则,Lambda像以前一样调用外部API,但还保存了对Redis Cache的响应。因此,将随后向ProxyLambda的请求提供相同的资源,将从缓存返回,而不是调用外部API。

基本上,下面的两个图应解释全部

API caching with Redis - component diagram

API caching with Redis -  sequence diagram

仍然存在有关缓存中记录无效的问题。在这里,策略必须符合要求。在此演示中,缓存中的对象是永恒的。解决方案之一是在保存(redis.setEx(cacheKey, 86400, apiResponse)上进行硬码到期时间。一种更优雅的方法是创建专用的无效lambda,当收到外部API中某些资源已被删除或修改的事件时,它将从缓存中删除对象。

解决方案的利弊

¢表现更好。 REDIS缓存的响应比外部API的速度要快得多。延迟也稳定,不依赖当前的API负载。

¢提高了可靠性。即使外部API降低,我们面对的API也可以做出响应。

ð¢在外部API上的负载减少,因为请求较少。

ðâ€额外的管理和维护弹性。

ðâ€