服务端应用多级缓存架构方案

服务端,应用,多级,缓存,架构,方案 · 浏览次数 : 82

小编点评

**场景20w的QPS场景下服务端架构设计** * 主从架构:主提供读写,从作为备,不提供读写服务。 * 缓存数据共享的模式:主从架构,实现高可用。 * 解决方案可通过增加redis集群中的机器数量,扩展缓存的容量和并发读写能力。 * 缓存热点问题可通过本地缓存解决,本地缓存可以避免redis单台缓存服务器的高负载。 * 多级缓存同步方案可以解决缓存热点问题,但需要进行缓存大小评估。 **缓存同步组件选型采用redis的发布订阅。** **其他注意事项** * 本地缓存占用java进程的jvm内存空间,故不能进行大数据量存储,需要进行缓存大小评估。 * 业务能接受短暂数据的不一致,更适用于读场景。 * 缓存更新策略,主动更新和被动更新,本地缓存一定要设置有效期。 * 定时任务同步缓存机制,根据业务情况考虑极端情况数据丢失。 * rpc调用避免本地缓存污染,可通过深拷贝解决。

正文

一:场景

20w的QPS的场景下,服务端架构应如何设计?

二:常规解决方案

可使用分布式缓存来抗,比如redis集群,6主6从,主提供读写,从作为备,不提供读写服务。1台平均抗3w并发,还可以抗住,如果QPS达到100w,通过增加redis集群中的机器数量,可以扩展缓存的容量和并发读写能力。同时,缓存数据对于应用来讲都是共享的,主从架构,实现高可用。

三:如何解决缓存热点(热key)问题

但是如果出现缓存热点,比如10w流量来自同一个key,打到同一个redis实例,那么就有可能出现CPU被打满,这种增加redis集群数量解决不了问题。

本地缓存可以解决热key问题,主要原因是本地缓存可以避免redis单台缓存服务器的高负载。通过复制多份缓存副本,将请求分散到多个缓存服务器上,可以减轻缓存热点导致的单台缓存服务器压力。此外,本地内存缓存也具有更快的访问速度,因为数据存储在应用程序的内存中,无需跨网络传输数据。

四:通用多级缓存方案

请求优先打到应用本地缓存,本地缓存不存在,再去r2m(redis)集群拉取,同时缓存到本地

五:多级缓存同步方案

1 运营后台保存数据,写入r2m缓存,同时通过redis的发布订阅功能发布消息

2 本地应用集群作为消息订阅者,接受消息后,删除本地缓存,C端流量请求打过来的时候,如果本地缓存不存在,则将r2m中缓存加载到本地缓存。

3 定时任务是防止极端情况下,r2m缓存失效,将数据重新加载到r2m缓存。

六:缓存同步组件选型

采用redis的发布订阅。

Redis的发布订阅模式是推模式。在Redis中,SUBSCRIBE命令用于订阅一个或多个频道,以便在有消息发布到这些频道时接收通知。PUBLISH命令用于向一个或多个频道发布消息。当有消息发布到某个频道时,所有订阅该频道的客户端都会收到该消息。在推模式下,每个频道维护一个客户端列表,发送消息时遍历该列表将消息推送给所有订阅者。拉模式则相反,发送者将消息放到一个邮箱中,所有订阅这个邮箱的客户端可以在任意时刻去收取。确保所有客户端都成功收取完整的邮件后,才删除该邮件。

Redis的发布订阅是异步的。当有消息发布到某个频道时,Redis会异步地将消息推送给所有订阅该频道的客户端。这意味着,客户端不会阻塞等待消息,而是继续执行其他任务,直到需要接收消息时才会去获取。这种异步方式可以提高系统的并发性和效率。

七:使用本地缓存注意事项

1 本地缓存占用java进程的jvm内存空间,故不能进行大数据量存储,需要进行缓存大小评估。

2 业务能接受短暂数据的不一致,更适用于读场景。

3 缓存更新策略,主动更新和被动更新,本地缓存一定要设置有效期

4 定时任务同步缓存机制,根据业务情况考虑极端情况数据丢失

5 rpc调用避免本地缓存污染,可通过深拷贝解决。

6 本地缓存随着应用重启而失效,注意加载分布式缓存时机

7 redis的pub,sub模式更新缓存策略(删除本地缓存key,避免在pub,sub模式下传递大value,pub,sub模式不会持久化消息数据,导致消费者对应redis的缓冲区超限,从而导致数据丢失),本地缓存失效时,加锁synchronized,由一个线程加载r2m缓存,避免并发更新。

备注:r2m底层由redis实现。

作者:京东科技 张石磊

来源:京东云开发者社区

与服务端应用多级缓存架构方案相似的内容:

服务端应用多级缓存架构方案

## 一:场景 20w的QPS的场景下,服务端架构应如何设计? ## 二:常规解决方案 可使用分布式缓存来抗,比如redis集群,6主6从,主提供读写,从作为备,不提供读写服务。1台平均抗3w并发,还可以抗住,如果QPS达到100w,通过增加redis集群中的机器数量,可以扩展缓存的容量和并发读写能

带有ttl的Lru在Rust中的实现及源码解析

TTL是Time To Live的缩写,通常意味着元素的生存时间是多长。 应用场景 数据库:在redis中我们最常见的就是缓存我们的数据元素,但是我们又不想其保留太长的时间,因为数据时间越长污染的可能性就越大,我们又不想在后续的程序中设置删除,所以我们此时需要设置过期时间来让数据自动淘汰。 sete

[转帖]ESXi主机网卡识别为10Mb导致业务缓慢

某企业所有业务系统及应用运行在由5台安装了ESXi 6.0的服务器组成的虚拟化环境中,已经稳定运行了多年,基本上没有出过问题。 今天下午企业工程师联系我,说单位的业务系统访问很慢。在业务系统中PING网关的延时超过2ms,平常都是小于1ms。近期单位服务器与网络没有改动。 检查发现有台物理主机内存报

初步探索GraalVM——云原生时代JVM黑科技

1 云原生时代Java语言的困境 经过多年的演进,Java语言的功能和性能都在不断的发展和提高,诸如即时编译器、垃圾回收器等系统都能体现Java语言的优秀,但是想要享受这些功能带来的提升都需要一段时间的运行来达到最佳性能,总的来说Java是面向大规模、长时间使用的服务端应用而设计的。 云原生时代,J

如何实现Excel中的多级数据联动

> 摘要:本文由葡萄城技术团队于博客园原创并首发。转载请注明出处:[葡萄城官网](https://www.grapecity.com.cn/),葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 ## 前言 在类Excel表格应用中,常用的需求场景是根据单元格之间的数据联动,例如选择某个

Linu部署服务启停脚本

Linux项目部署启停 WEB应用(WAR包)部署 实际开发中,难免遇见新业务项目构建、项目重构(重新优化整个项目的架构,相当于重写),也可能是项目拆分多个模块,也可能部分拆分,但项目的模块化分离,就存在新建项目,新开服务端的可能,在Linux部署中,我们通常遇见需要搭建一个新的服务: WEB应用(

WPF实现类似ChatGPT的逐字打印效果

###背景 前一段时间ChatGPT类的应用十分火爆,这类应用在回答用户的问题时逐字打印输出,像极了真人打字回复消息。出于对这个效果的兴趣,决定用WPF模拟这个效果。 >真实的ChatGPT逐字输出效果涉及其语言生成模型原理以及服务端与前端通信机制,本文不做过多阐述,重点是如何用WPF模拟这个效果。

frida动态插桩初探

前言 近期碰到了分析app的需求,就学习了一下 frida的动态插桩技术。frida是一款轻量级HOOK框架,可用于多平台上,例如android、windows、ios等。frida分为两部分,服务端运行在目标机上,通过注入进程的方式来实现劫持应用函数,另一部分运行在我们自己的控制机上。frida上

.NET微服务系统迁移至.NET6.0的故事

本次迁移涉及的是公司内部一个业务子系统,该系统是一个多样化的应用,支撑着公司的多个业务方向。目前,该系统由40多个基于.NET的微服务应用构成,使用数千个CPU核心和数TB内存,在数百个Linux容器中运行。每天,该系统需要处理数十亿次请求。 该系统其中大部分服务是在2018-2019年左右由老旧.

分布式事务 —— SpringCloud Alibaba Seata

Seata 简介 传统的单体应用中,业务操作使用同一条连接操作不同的数据表,一旦出现异常就可以整体回滚。随着公司的快速发展、业务需求的变化,单体应用被拆分成微服务应用,原来的单体应用被拆分成多个独立的微服务,分别使用独立的数据源,业务操作需要调用三个服务来完成。此时每个服务内部的数据一致性由本地事务