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

许多开发者都希望能够彻底搞清楚 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 缓存的价值,您看到了吗?

图片

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

图片

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

图片

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

图片

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构(Java实现)-字符串常量池与通配符

字符串常量池 在Java程序中,类似于:1, 2, 3,3.14,“hello”等字面类型的常量经常频繁使用,为了使程序的运行速度更快、更节省内存,Java为8种基本数据类型和String类都提供了常量池。…

【数据结构】栈---C语言版(详解!!!)

文章目录 🐸一、栈的概念及结构🍄1、栈的概念定义🍄2、动图演示🌲入栈🌲出栈🌲整体过程 🐸二、栈的实现🐸三、数组结构栈详解🍎创建栈的结构⭕接口1:定义结构…

R语言中缺失值的处理

目录 一.寻找缺失值 1.complete.cases() 2.manyNAs 二.缺失值的处理 1.直接删除 2.填补缺失值 一.寻找缺失值 1.complete.cases() #会展现缺失值 algae[!complete.cases(algae),] 2.manyNAs > manyNAs(algae) [1] 62 199 #表示第62条和第199条都有很多缺失值>m…

Systrace分析App性能学习笔记

学习Gracker Systrace系列文章,总结使用Systrace分析App性能的方法。推荐想通过Systrace学习Framework的同学,去看原文。 文章目录 概述Systrace使用流程Systrace 文件生成图形方式(不推荐)命令行方式 Systrace分析快捷键使用帧状态线程状态查看线程唤醒…

Dubbo 应用切换 ZooKeeper 注册中心实例,流量无损迁移

首先思考一个问题:如果 Dubbo 应用使用 ZooKeeper 作为注册中心,现在需要切换到新的 ZooKeeper 实例,如何做到流量无损? 本文提供解决这个问题的一种方案。 场景 有两个基于 Dubbo 的微服务应用,一个是服务提供者&…

RT-Thread 内核移植

内核移植 内核移植就是将RTT内核在不同的芯片架构、不同的板卡上运行起来,能够具备线程管理和调度,内存管理,线程间同步等功能。 移植可分为CPU架构移植和BSP(Board support package,板级支持包)移植两部…

四轴飞行器的电池研究(MatlabSimulink仿真)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

《TCP/IP网络编程》阅读笔记--基于Windows实现Hello Word服务器端和客户端

目录 1--Hello Word服务器端 2--客户端 3--编译运行 3-1--编译服务器端 3-2--编译客户端 3-3--运行 1--Hello Word服务器端 // gcc hello_server_win.c -o hello_server_win -lwsock32 // hello_server_win 9190 #include <stdio.h> #include <stdlib.h> #i…

一般不用buildroot来编译uboot和kernel

Buildroot 是一个流行的嵌入式 Linux 系统构建工具&#xff0c;它可以帮助开发者自动化地构建完整的嵌入式 Linux 系统&#xff0c;包括文件系统、内核以及各种用户空间应用程序。虽然 Buildroot 在构建嵌入式系统方面非常强大且易于使用&#xff0c;但一般情况下&#xff0c;它…

蓝牙发展现状

目录 一、产品分类1、Bluetooth经典2、Bluetooth低能耗(LE)3、二者差异 二、出货量三、未来需要加强的方向四、技术行业细分五、学习资料1、蓝牙官网2、大神博客——于忠军 一、产品分类 1、Bluetooth经典 Bluetooth Classic无线电&#xff0c;也被称为Bluetooth 基本速率/增强…

windows11 利用vmware17 安装ky10-server-x86操作系统

下载相关软件和镜像 vmware17 下载 下载页面 Download VMware Workstation Pro ky10server-x86镜像下载 官网 国产操作系统、银河麒麟、中标麒麟、开放麒麟、星光麒麟——麒麟软件官方网站 (kylinos.cn) 选择对应版本去下载 安装 选择镜像&#xff0c;点击下一步 磁盘设置要…

macOS上制作arm64的jdk17镜像

公司之前一直用的openjdk17的镜像&#xff0c;docker官网可以直接下载&#xff0c;但是最近对接的一个项目&#xff0c;对方用的是jdk17&#xff0c;在对接的时候有加解密异常的问题&#xff0c;为了排查是不是jdk版本的问题&#xff0c;需要制作jdk17的镜像。docker官网上的第…

Spark-Core核心算子

文章目录 一、数据源获取1、从集合中获取2、从外部存储系统创建3、从其它RDD中创建4、分区规则—load数据时 二、转换算子(Transformation)1、Value类型1.1 map()_1.2 mapPartitions()1.3 mapPartitionsWithIndex(不常用)1.4 filterMap()_扁平化&#xff08;合并流&#xff09;…

Docker部署RustDesk Server 设置开机自启

三、Docker安装 Docker官方和国内daocloud都提供了一键安装的脚本&#xff0c;使得Docker的安装更加便捷。 官方的一键安装方式&#xff1a; curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 国内 daocloud一键安装命令&#xff1a; curl -sSL https://…

测试验证平台

测试验证平台 1.功能说明&#xff1a; 模拟智能终端车端数据采集及上报的功能&#xff0c;提供数据管理平台的模拟和验证功能。 2.系统组成&#xff1a; 系统示意图 功能要求&#xff1a; 本地电脑实现Imx6配置功能&#xff0c;能够通过运行不同的脚本&#xff0c;模拟不…

Java“牵手”京东商品详情数据,京东API接口申请指南

京东平台商品详情接口是开放平台提供的一种API接口&#xff0c;通过调用API接口&#xff0c;开发者可以获取京东商品的标题、价格、库存、月销量、总销量、库存、详情描述、图片等详细信息 。 获取商品详情接口API是一种用于获取电商平台上商品详情数据的接口&#xff0c;通过…

说说Flink双流join

分析&回答 Flink双流JOIN主要分为两大类 一类是基于原生State的Connect算子操作另一类是基于窗口的JOIN操作。其中基于窗口的JOIN可细分为window join和interval join两种。 基于原生State的Connect算子操作 实现原理&#xff1a;底层原理依赖Flink的State状态存储&…

大学物理 之 安培环路定理

文章目录 前言什么是安培环路定理安培环路定理有什么作用 深入了解深入学习 前言 什么是安培环路定理 安培环路定理的物理意义在于描述了电流和磁场之间的相互作用&#xff0c;以及如何在一个封闭的回路中分析这种相互作用。 简单的来说 , 用环路定理来解决在磁场中B对任意封…

C++ 浅拷贝和深拷贝

目录 1. 浅拷贝 2. 深拷贝 1. 浅拷贝 浅拷贝只是拷贝一个指针&#xff0c;并没有新开辟一个地址&#xff0c;拷贝的指针和原来的指针指向同一块地址&#xff0c;如果原来的指针所指向的资源释放了&#xff0c;那么再释放浅拷贝的指针的资源就会出现错误 对一个已知对象进行拷贝…

springMVC之拦截器

文章目录 前言一、拦截器的配置二、拦截器的三个抽象方法三、多个拦截器的执行顺序总结 前言 拦截器 一、拦截器的配置 SpringMVC中的拦截器用于拦截控制器方法的执行 SpringMVC中的拦截器需要实现HandlerInterceptor SpringMVC的拦截器必须在SpringMVC的配置文件中进行配置&…