技术干货 —— 手把手教你通过缓存提升 API 性能

news2024/11/29 0:48:55

许多开发者都希望能够彻底搞清楚 API 的工作方式,以及如何利用缓存 API 请求来提升业务,但是当这个需求进入实现阶段时,许多人就会发现手头并没有合适的工具和恰当的方法,所以我们今天就为大家做一个全面的讲解:

① 几种不同的 API 缓存实现方式

② 上述方式的优缺点以及如何为每个 API 制定最适合的缓存策略

首先我们想要提出一个重要的结论:按照下文介绍的方法进行测试后 Akamai 发现,通过恰当的缓存技术,API 的交付速度可以实现21%的提升

测试方法和基线的建立 —— 以喵星人为例

我们将使用一款名为 Siege 的负载测试和性能基准工具针对样本 API 创建请求。Siege 的运行界面类似下图所示,会列出针对特定 URL 发起的所有请求的响应情况:

图片

在后续的测试中,我们使用了一个以 MongoDB 作为后端的 NodeJS API,这是一种基于 Express 的基本型 API,能够返回可供领养的小猫数据。毕竟人人都爱喵星人对吧!这个API的内容如下:

图片

我们将用一个简单的 GET 请求进行测试,该请求可返回一个大小为6.59 KB的 JSON 响应,其中包含227行内容,所有内容均为可领养小猫的数据:

图片

运行 GET 命令返回的标头数据如下所示。请注意,与服务器的连接将持续不中断,并且我们会使用 GZIP 来降低载荷大小:

图片

在第一次测试中,我们用5分钟时间通过5个并发用户从本机运行 Siege,负责处理请求的 Express 服务器同样在本机运行,也就是说,完全不涉及网络通信。这是为了排除与网络有关的各种可能干扰,建立准确的基线。我们使用下列命令让 Siege 运行5分钟,并模拟5个并发用户发起 GET 请求:

$ siege -c 5 –time=5m –content-type “application/json” GET http://localhost:3000/cats

首次运行的结果如下,其中包含(事务)命中数、测试运行时长、测试传输的数据量、事务处理速率,以及成功和失败事务的数量等数据:

图片

这些数据将用作后续测试和对比的基线。

不同场景的测试和结果

首先引入应用程序级缓存。我们将使用 apicache NPM 包为这个应用添加一种简单的内存驻留响应缓存。添加该包(运行“npm install apicache”命令)后,添加下列几行配置信息启用该包:

图片

随后再次进行测试并运行“get_all_cats”。请注意,原先采用的命令已经被注释掉了,新运行的命令使用了 apicache,并会通过指令将该响应缓存5分钟:

图片

下文的不同测试中,随着缓存的启用和禁用,我们会分别使用上述的一条命令,并会重启动 NodeJS 服务器以便清除内存中可能对测试结果产生影响的残留数据。如果向服务器发出请求,并且在得到的响应中包含“cache-control”,则意味着这是一个被缓存的响应。该标头的 max-age 值已设置为300秒(即应用中指定的5分钟):

图片

此外还可以打开 apicache 模块的调试模式,已确认该模块是否正常运行:

图片

从上图可以看到,第一个请求花了31毫秒才将数据返回给客户端,但后续请求所需的时间已经大幅缩短。因为第一个请求是完整请求,所有后续请求都是由内存中的缓存提供响应的,因此可在不到0.5毫秒的时间返回客户端。这正是缓存最核心的优势。

接下来再次运行和上文完全相同的 Siege 命令,看看在使用应用程序级缓存之后,结果会有何不同:

$ siege -c 5 –time=5m –content-type “application/json” GET http://localhost:3000/cats

图片

看到了吧!仅仅应用程序级的缓存就产生了这么大的效果。同样五分钟里,启用缓存后命中数提高了60%。虽然数据传输量也更多,但每秒处理的事务数量高达449条,最初仅仅为每秒179条,同样提升了60%!仅仅为 API 设置缓存就获得这样的效果,这样的收益谁不喜欢。

接着将网络因素考虑在内。出于测试和展示等因素考虑,我在 Digital Ocean 纽约数据中心开通了一台1GB 内存,1颗虚拟处理器,一块25GB 容量 SSD 硬盘的 Droplet 服务器。这是 Digital Ocean 所能提供的最低硬件配置的虚拟机,而我们专门选择这一配置,是为了测试在硬件性能有限的情况下,API 缓存能实现的效果。将上文提到的 NodeJS cats API 部署到 Droplet 服务器,并在前端使用 Nginx 作为代理将来自80端口的请求发送至 NodeJS 的3000端口。此外同样在本地运行了一个 MongoDB 实例充当该 API 的后端。此外服务器上未运行任何其他软件。

向服务器发出请求并查看返回的响应标头,内容如下图所示,从中可以看到,“Nginx”字样意味着这次测试并非在本机上进行的:

图片

接下来针对 Digital Ocean 的服务器,(使用IP地址)再次运行相同的 Siege 命令:

$ siege -c 5 –time=5m –content-type “application/json” GET http://206.81.0.14/cats

在不缓存 API 响应的情况下,针对 Digital Ocean VPS 运行 Siege 的结果如下:

图片

本机运行,以及 IaaS 平台运行,两次对比的结果有如下差异:

◆ 命中数和事务处理数量降低了35%

 首次开始出现失败的事务

降低35%,这个结果已经很严重了,不过考虑到这是在多租户云平台上运行的结果,似乎也不是那么出人意料。那么对于 Digital Ocean 的这个场景,启用 apicache 又能产生多大的效果?按照上文列出的方法启用 API 缓存,随后为了确认缓存已经启用,再次向 Digital  Ocean 的服务器发出一个 API 请求,并查看其响应内容如下:

图片

从中可以看到标头中包含“cache-control”,意味着缓存已经成功启用,且缓存寿命为5分钟(300秒)。接着再次针对 Digital Ocean 服务器运行相同的 Siege 命令:

$ siege -c 5 –time=5m –content-type “application/json” GET http://206.81.0.14/

图片

哇!这次在启用缓存后,5分钟内处理的事务数量增加了4,932条,并且处理速度提升了21%(由每秒63条提高至每秒80条)。由于服务器不需要每次都重新生成响应,因此相同时间里可以提供更多数据。这个结果完美诠释了对 API 响应创建缓存这种做法的价值。

最后为了便于大家比较,我们将上述几次测试的结果统一放在一起。API 缓存的价值,您看到了吗?

图片

↑↑↑本机测试,无缓存↑↑↑

图片

↑↑↑本机测试,有缓存↑↑↑

图片

↑↑↑网络测试,无缓存↑↑↑

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/967865.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python的由来和基础语法(一)

目录 一、Python 背景知识 1.1Python 是咋来的? 1.2Python 都能干啥? 1.3Python 的优缺点 二、基础语法 2.1常量和表达式 2.2变量和类型 变量的语法 (1) 定义变量 (2) 使用变量 变量的类型 (1) 整数 (2) 浮点数(小数) (3) 字符串 (4) 布尔 (5) 其他 动态类型…

NAT与代理服务器

1.DNS Domain Name System 是一整套从域名映射到IP的系统(把域名转化为IP地址) 2.域名简介 3.周鸿祎 傅盛 4.ICMP协议 用来网络故障排查原因 草图理解“位置” ping ICMP 是绕过TCP UDP传输协议的,没有端口号 traceroute 5.NAT技术 N…

Shell脚本练习——系统应用相关

显示系统信息 [rootwenzi data]#cat systemInfo.sh #/bin/bash RED"\E[1;31m" GREEN"\E[1;32m" END"\E[0m" echo -e "$GREEN----------------------Host systeminfo--------------------$END" echo -e "HOSTNAME: $REDho…

论文阅读:Distortion-Free Wide-Angle Portraits on Camera Phones

论文阅读:Distortion-Free Wide-Angle Portraits on Camera Phones 今天介绍一篇谷歌 2019 年的论文,是关于广角畸变校正的。 Abstract 广角摄影,可以带来不一样的摄影体验,因为广角的 FOV 更大,所以能将更多的内容…

git ------ IDEA中建立本地/远程仓库及上传

目录 建立本地仓库 1. idea中选择创建本地仓库 选择目标文件 创建远程仓库 1.码云上进行库创建 将本地仓库数据提交到远程仓库 提交代码 推送到远程 建立本地仓库 1. idea中选择创建本地仓库 或 vsm中找下列2 即可 选择目标文件 成功后会出现以下标识 更新 提交 推…

YOLO目标检测——室内场景识别数据集下载分享

目标检测室内场景识别数据集可以广泛应用于各种需要对室内场景进行目标识别和跟踪的领域,包括安防监控、智能家居、物流仓储管理等 数据集点击下载: YOLO室内场景识别数据集(一)5950图片26类别.rar YOLO室内场景识别数据集&#…

基础算法--快速排序

快速排序 算法原理 1. 取一个元素p(第一个元素,最后一个元素,中间元素,随机 都可以),使元素p归位。 2. 列表被p分成两部分,左边都比p小,右边都比p大。 3. 递归完成排序。 动态演示 python代码实现 import…

Code Snippet的使用

文章目录 前言Code Snippet:就是咱们在VS中敲的prop、propfull、ctol【构造器快捷键】、for等快捷键,然后按tab键自动生成代码1.VS自带的:prop、propfull、ctol【构造器快捷键】、for等快捷键,直接使用2.自定义Snippet: 巨人的肩膀…

深度学习入门教学——卷积神经网络CNN

目录 一、CNN简介 一、输入层 二、卷积层 三、池化层 四、全连接层 一、CNN简介 1、应用领域 检测任务 分类与检索 超分辨率重构 2、卷积网络与传统网咯的区别 传统神经网络和卷积神经网络都是用来提取特征的。神经网络: 可以将其看作是一个二维的。卷积神经…

力扣:随即指针138. 复制带随机指针的链表

复制带随机指针的链表 OJ链接 分析: 该题的大致题意就是有一个带随机指针的链表,复制这个链表但是不能指向原链表的节点,所以每一个节点都要复制一遍 大神思路: ps:我是学来的 上代码: struct Node* copyRandomList(s…

3D DRAM:突破内存瓶颈的新希望

DRAM,动态随机存储器,是一种在计算机、消费电子、通信等领域广泛应用的内存技术。它的主要特点是在同一周期内可以随机读取或写入单字节数据,使得其在各种计算应用中成为不可或缺的组件。 DRAM的发展历程充满了戏剧性和技术革新。最早的DRAM诞…

【5】openGL使用宏和函数进行错误检测

当我们编写openGL程序,没有报编译链接错误,但是运行结果是黑屏,这不是我们想要的。 openGL提供了glGetError 来检查错误,我们可以通过在运行时进行打断点查看glGetError返回值,得到的是一个十进制数,将其转…

Jenkins+maven+testng+htmlreport单元自动化测试

背景说明 为了可以在jenkins自动化运行单元测试的代码,所以使用maventestng的技术结合,达到手动或者定时去执行单元测试的代码,以便提高人工运行的自动化的效率。单元通过该方案也可以套用在httpclient框架去执行测试web api接口的自动化测试…

SILERGY(矽力杰)功率电子开关 SY6280AAC

SILERGY(矽力杰)功率电子开关 SY6280AAC Low Loss Power Distribution Switch SOT-5 Pacakge 2.4V ~ 5.5V (<6V) 0.6W Max. Current 2A Reverse blocking (no body diode) Programmable current limit ( Ilimits(A) 6800 / Rset(ohm). ) Application Circuit (Reco…

跳出Lambda表达式forEach()循环解决思路

背景 在一次需求开发时&#xff0c;发现使用Lambda的forEach()跳不出循环。如下示例代码&#xff0c;想在遍历满足条件时跳出循环。 public static void main(String[] args) {List<Integer> list Arrays.asList(1, 4, 5, 7, 9, 11);list.forEach(e -> {if (e % 2 …

质量属性案例-架构真题(二十一)

试题一 某电子商务公司升级会员与促销管理系统&#xff0c;向用户提交个性化服务&#xff0c;提高用户粘性。在项目建立之初&#xff0c;公司领导人一致认为目标是提升会员管理方式的灵活性&#xff0c;由于当前用户规模不大&#xff0c;用户简单&#xff0c;系统方面不需要做…

Python游戏开发-超级海盗!!!

开发环境配置 安装python环境后&#xff0c;下载pygame模块&#xff0c;使用如下命令 pip install pygame 注&#xff1a;该项目使用了一些新特性&#xff0c;使用3.10以上的版本 游戏项目介绍 游戏分为两个模块&#xff0c;分别是编辑模块和关卡模块&#xff0c;在编辑模…

Lesson5-2:OpenCV视频操作---视频追踪

学习目标 理解meanshift的原理知道camshift算法能够使用meanshift和Camshift进行目标追踪 1.meanshift 1.1原理 m e a n s h i f t meanshift meanshift算法的原理很简单。假设你有一堆点集&#xff0c;还有一个小的窗口&#xff0c;这个窗口可能是圆形的&#xff0c;现在你可…

CocosCreator3.8研究笔记(四)CocosCreator 脚本说明及使用(上)

在Cocos Creator中&#xff0c;脚本代码文件分为模块和插件两种方式&#xff1a; 模块一般就是项目的脚本&#xff0c;包含项目中创建的代码、引擎模块、第三方模块。 插件脚本&#xff0c;是指从 Cocos Creator 属性检查器中导入的插件&#xff0c;一般是引入第三方引入库文件…

PixelSNAIL论文代码学习(3)——自注意力机制的实现

文章目录 引言正文介绍自注意力机制的简单实现样例本文中的自注意力机制具体实现代码分析nn.nin函数的具体实现nn.causal_attention模块实现注意力模块实现代码完整实现代码使用pytorch实现因果注意力模块causal_atttention模块 问题 总结引用 引言 阅读了pixelSNAIL,很简短&a…