微服务实践01--微服务管理11--缓存02--分级缓存设计

本文涉及的产品
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 微服务实践01--微服务管理11--缓存02--分级缓存设计

微服务实践目录,可以参见连接。

缓存系列包括:
1.微服务管理-11.缓存概述
1.微服务管理-11.缓存-0.技术
1.微服务管理-11.缓存-1.多级缓存设计
1.微服务管理-11.缓存-2.典型缓存架构设计
1.微服务管理-11.缓存-3.实践
[1.微服务管理-11.缓存-4.总结]()

背景

通过前面的文章说明了缓存的基本内容,但对于缓存来说可以在网络服务中的分层架构中的任意一点都存在。从网络服务分层架构的最前端浏览器到最后端数据库都使用了缓存技术。简单的看在网络服务中的每一层中都有缓存,那就是多级缓存。

像CPU的Cache系统的缓存层级的划分是因为CPU在做着几方面的权衡:速度、容量、晶体管体积、发热量等。L1为了更快的访问,用了更多/更大/更复杂的晶体管。而L2为了更大容量,选择了更小/更简单的晶体管来实现。而在互联网系统中应该考虑哪些权衡点来设计不同级别的缓存就成了问题。
cpu存储特性

分级原因

经典和通用型的互联网系统就是一个分层系统,按照互联网系统的分层概念在每一层上都有不同的缓存技术与处理方式。互联网分层缓存技术可以参见:一篇文章让你明白你多级缓存的分层架构。我们这里不讨论分层架构中每层中缓存技术,这里讨论从服务(业务)接收到用户请求后到服务(业务)端作出响应的这部分的缓存分级。

  • 分级场景

那么在互联网系统中为什么做缓存分级?答案就是解决“缓存雪崩”问题。缓存雪崩就是指缓存由于某些原因(混存宕机、大面积数据过期),导致大量请求到达后端数据库。进一步促成数据库崩溃,整个系统崩溃,发生灾难。

通过多级缓存解决缓存雪崩的问题。一方面可以提高缓存的稳定性,另一方面可以将分级缓存看作有一个更大的缓存。这个缓存池内缓存着所有的数据,只要通过缓存击穿的各种机制将数据一级一级的提调到最高级缓存中以达到像CPU分级缓存一样的要求。

除了缓存雪崩这个场景外,还有用户分群,地域分群等业务数据缓存可能会用到缓存分级的方式处理。

  • 与分布式缓存不同

分布式缓存是将缓存镜像同步到其他的缓存服务上。而缓存分级是将缓存划分为不同的层次,每一层存储的都是下层数据的子集。一个是镜像一个是子集,以这样的方式实现缓存在不同场景下不同的解决方案。

关注点

缓存分级主要解决缓存雪崩的问题。那么在解决这个问题的过程中就需要对分级缓存的需要设计的点或着需要重点关注的点进行梳理,并根据这些点进行有针对行的设计工作。

  • 同构或者异构

在《1.微服务管理-11.缓存概述》已经说明缓存的数据应该是越靠近响应的最终结果越好。这样可以最大限度的减少因为业务代码处理造成的延时问题。每级缓存应该保存同样的数据还是保存不同的数据就成了问题,最靠近业务服务的缓存是不是应该最应该是最终结果,而越靠近数据源的缓存是不是就应该更倾向于结构化数据。
同构与异构

  • 透明化

缓存分层后对于研发人员来说应该是透明的。不应牵扯到过多的业务代码。使业务代码和缓存代码耦合的分层缓存。

  • 自动化

各级缓存间的数据的同步应该最好能够自动化。可以从缓存更新的方式中直接获取缓存映射逻辑,并根据逻辑自行更新与失效缓存。缓存击穿后更新缓存需要有自动化方法。

业界方案

从业务分级缓存设计到的技术方面来看,分级缓存可以在客户端分级缓存和服务端分级缓存两种方式。下面分别说明这两种方式的内容:

  • 客户端分级缓存(Java)

Ehcache就是Hibernate缓存机制的缓存实现。而Hibernate本身就带有一级缓存、二级缓存功能。

J2Cache是一个Java的二级缓存框架。第一级缓存使用内存(同时支持 Ehcache 2.x、Ehcache 3.x 和 Caffeine),第二级缓存使用 Redis(推荐)/Memcached 。 由于大量的缓存读取会导致 L2 的网络成为整个系统的瓶颈,因此 L1 的目标是降低对 L2 的读取次数。 该缓存框架主要用于集群环境中。单机也可使用,用于避免应用重启导致的缓存冷启动后对后端业务的冲击。

layering-cache是一个支持分布式环境的多级缓存框架,使用方式和spring-cache类似,主要目的是在使用注解的时候支持配置过期时间。layering-cache其实是一个两级缓存,一级缓存使用Caffeine作为本地缓存,二级缓存使用redis作为集中式缓存。并且基于redis的Pub/Sub做缓存的删除,所以它是一个适用于分布式环境下的一个缓存系统。

  • 服务端分级缓存

    Redis ReplicationCodisTwemproxy都是服务端分布式缓存技术,但通过调查发现所有的服务器缓存技术都不支持服务端分级缓存的。本想借助于Redis的Replication自行实现Redis的多级缓存支持,但是调查发现Redis的Miss事件是没有对外公布的,无法使用Lua,watch进行Miss事件获取。所以,不能通过Miss事件进行下一集缓存查询。

设计

根据业界对于缓存的解决方案来说,对于服务端的缓存分级来说场景不多。故这里就不进行服务端缓存分级的考量。在这样的前提下对缓存进行分级。像CPU的缓存的方式一样,作者将缓存距离业务服务的远近对缓存服务进行分级。并说明这些分级下一般的实现技术。第一级缓存是服务的本地缓存,第二季缓存是服务外缓存服务器协助缓存。

第一级缓存应该存储数据量不是很大,数据更新频率较低的数据。一般情况下使用本地缓存作为第一级缓存。使用本地缓存的与微服务设计原则中的无状态服务有相互冲突。这种冲突在分级缓存的实现中必须解决,解决这个问题需要定义更好的缓存过期和缓存更新策略来解决。并分布式服务中每个服务都有多个实例,实例之间的缓存数据也需要进行同步保证数据的一致性。

第二级缓存使用缓存服务的方式实现就会增加缓存获取与操作过程中的进程间通信时间,所以缓存与最好处于同一个网络中,以减少网络通信的消耗。

缓存分级

回顾上面所说到的缓存分级注意事项:同构或者异构、透明化、自动化,通过对Ehcache可以解决上述说有的注意点。不过所有的跟缓存相关的代码都需要自行实现,实现过程中操作异构问题、解决缓存代码与业务代码隔离问题、解决自动化更新问题。

总结

分级缓存在一定等读上解决系统可靠性,可用性问题。并在此基础上可以解决在地域IDC中对于地域用户的数据的缓存与处理概念。以地域性划分IDC以使用户可以得到就近服务,就近处理用户的请求。分级缓存可以应用解决技术问题也可以解决业务数据问题,可以在适用的场景中适用

参考

多级缓存——原理
多级缓存设计详解 | 给数据库减负,刻不容缓!
有赞透明多级缓存解决方案(TMC)
千万级并发!如何设计一个多级缓存系统?
你所不知道的堆外缓存
一篇文章让你明白你多级缓存的分层架构

Cache为什么有那么多级?为什么一级比一级大?是不是Cache越大越好?

深入理解Redis Master-Slaver/Sentinel/Cluster原理
深入剖析Redis系列(三) - Redis集群模式搭建与原理详解
复制(Replication)
如何基于 Redis Replication 设计并实现 Redis-replicator?
Redis集群实现原理探讨
集群教程

如何优雅的设计和使用缓存?

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
4天前
|
设计模式 API 开发者
深入浅出微服务架构:从理论到实践
在软件开发领域,微服务架构已经成为一种流行的设计模式。它承诺能够带来更好的模块化、可扩展性和敏捷性。然而,将一个传统的单体应用拆分成多个微服务并非易事。本文旨在通过实际案例分析,帮助读者理解微服务的核心概念,以及如何在实际项目中实施微服务架构。我们将一起探讨微服务的设计原则、技术选型和面临的挑战,并分享一些成功实施的策略。
|
1天前
|
消息中间件 运维 监控
探索微服务架构:从理论到实践
【8月更文挑战第19天】 在数字化时代,微服务架构已成为软件开发的新常态。本文通过深入浅出的方式,介绍了微服务的基本概念、设计原则和实践案例,旨在帮助读者从宏观上理解微服务的设计理念,并掌握将其应用于实际项目中的方法。我们将一起走进微服务的世界,解锁其在现代软件工程中的奥秘。
|
1天前
|
Kubernetes 数据库 开发者
后端开发中的微服务架构实践
【8月更文挑战第19天】本文将深入探讨微服务架构在后端开发中的应用,包括其设计原则、挑战与解决方案。文章旨在为读者提供一种现代后端开发的新视角,帮助开发者更好地理解并应用微服务架构以提升系统的可维护性、可扩展性和敏捷性。
|
1天前
|
运维 API 持续交付
后端开发中的微服务架构实践
【8月更文挑战第19天】在现代软件工程中,微服务架构作为一种灵活、可扩展的后端解决方案,正逐渐取代传统的单体应用。本文将深入探讨微服务的核心概念、设计原则和实际应用策略,旨在为读者提供一套完整的微服务架构实施指南。
6 0
|
4天前
|
存储 缓存 Java
Eureka原理与实践:深入探索微服务架构的核心组件
在微服务架构日益盛行的今天,服务之间的注册与发现成为了保证系统高可用性和灵活性的关键。Eureka,作为Netflix开源的服务注册与发现框架,凭借其简单、健壮的特性,在微服务领域占据了举足轻重的地位。本文将深入剖析Eureka的原理,并通过实践案例展示其在实际项目中的应用,以期为开发者提供一个高端、深入的视角。
12 0
|
5天前
|
安全 Nacos 数据安全/隐私保护
【技术干货】破解Nacos安全隐患:连接用户名与密码明文传输!掌握HTTPS、JWT与OAuth2.0加密秘籍,打造坚不可摧的微服务注册与配置中心!从原理到实践,全方位解析如何构建安全防护体系,让您从此告别数据泄露风险!
【8月更文挑战第15天】Nacos是一款广受好评的微服务注册与配置中心,但其连接用户名和密码的明文传输成为安全隐患。本文探讨加密策略提升安全性。首先介绍明文传输风险,随后对比三种加密方案:HTTPS简化数据保护;JWT令牌减少凭证传输,适配分布式环境;OAuth2.0增强安全,支持多授权模式。每种方案各有千秋,开发者需根据具体需求选择最佳实践,确保服务安全稳定运行。
22 0
|
5天前
|
设计模式 监控 Java
深入浅出:微服务架构的设计与实践
在软件开发领域,微服务架构已成为一种越来越流行的设计模式。本文将通过浅显易懂的语言介绍微服务的基本概念、设计原则和实践方法,帮助初学者快速理解并应用微服务架构。
|
5天前
|
Kubernetes Cloud Native Devops
云原生之旅:从容器化到微服务的实践之路
随着云计算时代的深入发展,传统的软件开发与部署模式已逐渐不能满足现代业务的需求。云原生技术以其灵活性、可扩展性和高效率成为新的发展方向。本文将通过浅显易懂的语言,带领读者一探云原生世界的大门,从容器化技术的起步,到微服务架构的构建,再到DevOps文化的融入,逐步揭示云原生技术如何助力企业快速迭代和高效运维。无论你是云原生领域的新手,还是希望深化理解的开发者,这篇文章都将为你提供有价值的信息和启示。
12 0
|
5天前
|
存储 缓存 Java
Java本地高性能缓存实践问题之定义Caffeine的缓存的问题如何解决
Java本地高性能缓存实践问题之定义Caffeine的缓存的问题如何解决
|
5天前
|
存储 缓存 Java
Java本地高性能缓存实践问题之使用@CachePut注解来更新缓存中的数据的问题如何解决
Java本地高性能缓存实践问题之使用@CachePut注解来更新缓存中的数据的问题如何解决