《API加速优化方案:多级缓存设计》

news2025/3/11 6:43:29

点击上方蓝字关注我们!

2f22716713e4cecb4d8774c170d0507a.jpeg

这事情还得从两天前说起...话说迭代上了个接口,该接口横跨多个应用服务,链路如下图所示:

50ef35ddb298aef040a5a34d2fd3236f.png

问题来了:通过skywalking,我们的监控到dev环境的该接口偶尔请求耗时很长,且抛异常了:

4d0ee3c9e5877f26726aa0444d3b8cb7.png

f70a599a3ff61bb9b2247cecf2f38f0a.png

接口503的报错原因查明:

1、外部系统D应用接口响应慢,导致上游C服务的接口超时;

2、上游服务C最终做了降级处理,返回了空串内容给B服务;

3、B服务最终抛了NPE,导致最终接口500;

因此我们也定下了解决目标:

1、提供多级缓存来实现API加速优化

2、降级服务处理要做好一点,确保缓存一致性

4e0b370326bfa7fc39981d469c10b3d4.png

基于Redis和Cos的二级缓存

API优化方案涉及了COS和Redis。

f334d89462d21300d16f29129161e919.png

Redis自然不用过多介绍,这是缓存的主流中间件;基于内存的访问可以大大提高数据读取效率,这里也主要用于数据缓存。

d1725880cbb9d91e054e9b66ddbd12f6.png

COS对象存储(Cloud Object Storage,COS)是腾讯云提供的一种存储海量文件的分布式存储服务,具有高扩展性、低成本、可靠安全等优点;这里也是用于数据缓存。

基于Redis和Cos的二级缓存,如下图所示:

c4f0d09c2babf22c8435df17bf331da7.png

- Redis:提供基于内存的数据存储

- Cos:提供基于云的对象存储

- 远端数据源:跨集群的数据提供方

5e5a175494c1b591aaf61552c150ff99.png

API优化方案

基于Redis和Cos的二级缓存,API的优化方案如下:

583b36e26265b73b182a91d54e21dae8.png

【1】优化后的读API流程图:

(1)优先从redis读

(2)redis读不到,从cos读,写入redis

(3)cos读不到,从sca读

(4)写入redis、写入cos

2a9634ffaad6fe0d6b2a0c86e99122a4.png

【2】我们在Redis和Cos的缓存数据预处理上,采用了“存量预热”+“增量缓存”的策略:

(1)存量预热:目标存储到COS

fa0111bf1d468e6faf905f67d46968f2.png

(2)增量缓存:参考【1】优化后的读API流程图

68f8177b46b7acb69476bc5213f286e5.png

FAQ

Q1:有些同学问,为什么只有增量缓存时,数据才写入Redis呢;存量预热为什么没有写入Redis?

A1:从缓存穿透的角度看:只有主动读取API访问到的,该数据下次被访问的概率会更高,因此可以写入Redis,以使得下次访问获得更快的性能。虽然提前写入Redis存量预热的数据,在访问量不大的情况下,会造成大量的缓存浪费;Redis是非常宝贵的资源,虽然性能高但是价格昂贵,非必要不过渡使用它。

从缓存击穿的角度看:预热写入Redis的数据,都会配置EXPIRE生存时间,在高并发的情况下,同一批缓存有大概率一起过期失效,这将导致所有请求打到第三方系统D服务上。严重情况下,甚至出现缓存雪崩,导致下游服务过载重启,影响服务SLA。

Q2:存量预热的数据,在迁移数据过程中,会有什么风险呢?

A2:好问题,参考下面的“DB告警和监控”这Part。

Q3:COS的使用手册有吗?

A3:参考文档(https://cloud.tencent.com/document/product/436/6222)

Q4:COS的收费贵不?

A4:降本增效的背景下,我们开发资源很多时候受限于成本预算,下面我给出一部分的计费价格,大伙参考使用(1TB的存储大小)。

4db5fce24b7f935e01cfb9441d2664bf.png

Q5:COS的QPS是多少?

A5:使用了云服务商的产品,自然要进行性能评估了,我参考了文档的内容,其实每个存储桶的读QPS是可以达到30000的,应该是可以满足大部分业务需求(https://cloud.tencent.com/document/product/436/14518)

其实,cos存储成本并不高的,实际上的花费主要都是在流量上。

effb289b7021580445d3b4646293fec1.png

Q6:COS的读取比第三方系统的API读取快很多吗?

A6:是的,COS的读取在腾讯云内部会更加有网络保障;而第三方API接入相对来说,系统稳定性更加不可控。从最后的实现比对来看,COS读取大都在200ms左右完成,大大优于第三方API的性能表现。

4c0aacbde653e41e347a127ee10d555f.png

DB告警和监控

在存量数据预热的过程里,我们选择业务低峰期执行迁移任务。

不出意外的出现了意外,云数据库很快给出了告警:CPU使用率超过了80%(虽然不会对线上业务造成影响,但着实惊出一身冷汗)。

aa9e1b1a848ddb968c19ee2a8e55d4f5.png

这里给出几点启示:

(1)批量同步数据,千万要记住多线程执行小任务(减少出错概率互相影响)

(2)留下足够的时间间隔,让CPU任务使用率在多线程下摊分,降低CPU瞬时负载

88a23b8ea51517f02d18225610ae6f46.png

总结

以上是我们的一次API优化总结,最后还是给出2点提示:

- 数据预热过程可能很慢,我们其实可以跟产品,一起沟通下,能否可以按小项目维度去进行灰度功能(让预热数据及时跟上灰度范围)

- 迁移过程会产生非常大的DB查询,建议业务低峰期执行预热操作

往期推荐

《源码系列》

《JDK之Object 类》

《JDK之BigDecimal 类》

《JDK之String 类》

《JDK之Lambda表达式》

《Spring源码:Event事件发布与监听》

《互联网技术峰会》

《ArchSummit:从珍爱微服务框架看架构演进》

《ArchSummit_2022_全球架构峰会》

《2021年深圳ArchSummit全球架构师峰会》

《降本30%,酷家乐海量数据冷热分离设计与实践》

《经典书籍》

《Java并发编程实战:第1章 多线程安全性与风险》

《Java并发编程实战:第2章 影响线程安全性的原子性和加锁机制》

《Java并发编程实战:第3章 助于线程安全的三剑客:final & volatile & 线程封闭》

《服务端技术栈》

《Docker 核心设计理念》

《Kafka原理总结》

《HTTP的前世今生》

《如何进行一次高质量CR》

《一时重构一时爽,一直重构一直爽》

《一文带你看懂:亿级大表垂直拆分的工程实践》

《设计模式》

《设计模式之六大设计原则》

《设计模式之创建型(1):单例模式》

《设计模式之创建型(2):工厂方法模式》

《设计模式之创建型(3):原型模式》

《设计模式之创建型(4):建造者模式》

《设计模式之创建型(5):抽象工厂设计模式》

《设计模式之结构型(1):代理类设计模式》

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

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

相关文章

震撼开源!首个1万多人共同标注的35种语言的高质量对话数据集来啦

文 | 小戏 “数据”!“数据”!“数据”! 大模型时代,最珍贵的是什么?是 Transformer 的架构吗?是 RLHF 的方法吗? 不是!是数据,是高质量的数据,是高质量且开源…

科幻AI生活来临,博联版“贾维斯”让全屋智能触手可及

1 ChatGPT提升交互体验 解决人机语音交互痛点 据洛图科技(RUNTO)《中国智能音箱零售市场月度追踪》报告,2022年中国智能音箱市场销量为2631万台,市场销额达到75.3亿元。当前智能音箱已完成初轮用户普及,舒适的居家定制服务走入千家万户&…

低代码开发重要工具:jvs-logic(逻辑引擎)基础原理与功能架构

逻辑引擎介绍 逻辑引擎是一种能够处理逻辑表达式的程序,它能够根据用户输入的表达式计算出表达式的值。在实际应用中,逻辑引擎通常被用于处理规则引擎、决策系统、业务规则配置等领域,具有广泛的应用前景。 原理与核心功能描述 基础原理 …

JUC并发编程之CompletableFuture

Future future是java5新加的一个接口,他提供了一种异步并行计算的功能 接口定义了操作异步任务执行的一些方法,如获取异步任务的执行结果、取消任务的执行、判断任务是否被取消、判断任务是否执行完毕 目的:异步多线程执行且有返回结果&#…

干货分享 | 一文了解交互式应用程序安全测试(IAST)技术

软件开发过程中,安全检测极为重要。带有漏洞的软件一旦被恶意利用,将造成数据泄露、业务瘫痪,为企业带来不可估量的损失。这就要求企业在系统开发初期发现系统安全问题,快速定位应用漏洞并修复,从源头减少开发过程中的…

黑马点评Redis实战(短信登录;商户查询缓存)

黑马点评 通过一个类似于大众点评的项目了解学习redis在实战项目中的使用,下面是项目中会涉及到的模块: 一、导入黑马点评项目 导入springboot项目,导入sql脚本到数据库,开启nginx,更改项目配置文件中的redis和mys…

头部证券公司安全体系搭建实战讲解—开源网安S-SDLC平台助力金融科技安全发展

数字化时代背景下,新兴技术广泛应用导致软件安全隐患不断扩大。而金融行业由于项目周期长、业务规模大、应用数量多、合规监管严、内外合作多等特性,进一步加重了安全风险。 与此同时,《等保2.0》、《网络安全法》等国家政策的发布&#xff0…

【排序】直接插入排序与希尔排序(图示详解哦)

全文目录 引言直接插入排序思路实现 希尔排序思路实现 总结 引言 在上一篇文章中,我们实现了选择排序与堆排序,在本篇文章中将继续介绍直接插入排序与希尔排序: 直接插入排序与希尔排序都属于插入排序的一种: 这两种排序的思想都…

Ae:摄像机设置

Ae菜单:图层/摄像机设置 Camera Settings 快捷键:Ctrl Shift Y 新建摄像机图层时,首先会弹出摄像机设置 Camera Settings对话框。 经典 3D 渲染器时的摄像机设置 Cinema 4D 渲染器时的摄像机设置 类型 Type 有两种类型的摄像机供选择。 提…

空间矢量数据保存为GeoJSON、PDF等文件格式

专注系列化、高质量的R语言教程 推文索引 | 联系小编 | 付费合集 我们使用的空间矢量数据一般是Shapefile格式的,它在ArcGIS、R语言中都能加载,但是这种数据格式在使用时也有不便:它是由多个文件构成的,一般有.shp、.shx、.dbf、.…

Session和Cookie区别介绍+面试题

Session 会话: 对应的英文单词:session用户打开浏览器,进行一系列操作,然后关闭浏览器。整个过程叫做一次会话一个会话包含多次请求 session机制属于B/S结构的一部分,主要的作用就是为了保存会话状态。(用户登录成功后…

Spring使用注解存储和读取对象

文章目录 一、存储Bean对象配置扫描添加注解存储Bean对象注解使用范围Bean的命名五大类注解的关系为什么需要五大类注解? 二、方法注解BeanBean重命名 三、对象注入属性注入Setter注入构造方法注入Autowired 和 Resource 的区别 一、存储Bean对象 之前我们存储Bean时&#xff…

【MATLAB基础绘图第2棒】绘制柱状/饼图填充图

MATLAB绘制柱状填充图 方法1:hatchfill2工具1.1 案例1:柱状图填充1.2 案例2:饼图填充 方法2:applyhatch函数2.1 案例1:柱状图填充2.2 案例2:饼图填充 方法3: applyhatch_plusC函数3.1 案例1&…

分析软件及其隐藏后门实验笔记

软件后门和软件加壳是什么 软件后门可以理解为在软件中植入病毒等具有后门功能的代码,通过运行软件来对用户的系统造成破坏、窃取机密等。 软件加壳一种常用的方式是在二进制的程序中植入一段代码,在运行的时候优先取得程序的控制权,之后再把…

Cisco SD-WAN (Viptela) version 20.11.1 ED - 软件定义广域网

请访问原文链接:https://sysin.org/blog/cisco-sd-wan-20/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org 支持 SASE 的架构,其集成了面向多云、安全、统一通信和应用优化的各种功能,可用于轻…

ChatGPT干掉程序员?想多了...

GPT-4才诞生没几天,感觉朋友圈已经被这个人工智能刷屏了,大家一边在感叹人工智能行业蓬勃发展的同时,一边又有不少人患上了AI焦虑症。 这其中,以程序员首当其冲。原因无他,只因为GPT-4的惊人的能力和不少大佬的发言。 …

4.17~4.18学习总结

网络编程 概述 1.什么是网络编程 在网络通信协议下,不同计算机上运行的程序,进行的数据传输,计算机跟计算机之间可以通过网络进行数据传输。 2.常见的软件架构: B/S,C/S 3.通信的软件架构CS BS各有什么区别和优点…

阿里云免费使用stable diffusion三个月【ai生成图片】详细教程【保姆级】

起因 这两天关注了ai生成图片,尝试了mijiourney服务【比较贵没入手】,结果免费的没有了,没用上,换了国内的一些小程序体验了下 综合体验式是太慢了,而他们是基于国外开源的stable diffiusion模型开发的【可以比肩mij…

【FAQ】关于华为推送服务因营销消息频次管控导致服务通讯类消息下发失败的解决方案

一. 问题描述 使用华为推送服务下发IM消息时,下发消息请求成功且code码为80000000,但是手机总是收不到消息; 在华为推送自助分析(Beta)平台查看发现,消息发送触发了频控。 二. 问题…

java 快排算法详解,java 快排代码

快排是一种高效的数据结构,它使用一个关键字(Key)来表示数据元素的一个集合。也就是说,快排是一个有序数组,而这个有序数组由两个元素组成。 快排的基本思想是:如果数组元素的值比它前面的两个元素都大&…