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

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
注册配置 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
目录
相关文章
|
23天前
|
弹性计算 持续交付 API
构建高效后端服务:微服务架构的深度解析与实践
在当今快速发展的软件行业中,构建高效、可扩展且易于维护的后端服务是每个技术团队的追求。本文将深入探讨微服务架构的核心概念、设计原则及其在实际项目中的应用,通过具体案例分析,展示如何利用微服务架构解决传统单体应用面临的挑战,提升系统的灵活性和响应速度。我们将从微服务的拆分策略、通信机制、服务发现、配置管理、以及持续集成/持续部署(CI/CD)等方面进行全面剖析,旨在为读者提供一套实用的微服务实施指南。
|
19天前
|
运维 监控 Java
后端开发中的微服务架构实践与挑战####
在数字化转型加速的今天,微服务架构凭借其高度的灵活性、可扩展性和可维护性,成为众多企业后端系统构建的首选方案。本文深入探讨了微服务架构的核心概念、实施步骤、关键技术考量以及面临的主要挑战,旨在为开发者提供一份实用的实践指南。通过案例分析,揭示微服务在实际项目中的应用效果,并针对常见问题提出解决策略,帮助读者更好地理解和应对微服务架构带来的复杂性与机遇。 ####
|
19天前
|
算法 NoSQL Java
微服务架构下的接口限流策略与实践#### 一、
本文旨在探讨微服务架构下,面对高并发请求时如何有效实施接口限流策略,以保障系统稳定性和服务质量。不同于传统的摘要概述,本文将从实际应用场景出发,深入剖析几种主流的限流算法(如令牌桶、漏桶及固定窗口计数器等),通过对比分析它们的优缺点,并结合具体案例,展示如何在Spring Cloud Gateway中集成自定义限流方案,实现动态限流规则调整,为读者提供一套可落地的实践指南。 #### 二、
43 3
|
22天前
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
68 5
|
18天前
|
消息中间件 运维 安全
后端开发中的微服务架构实践与挑战####
在数字化转型的浪潮中,微服务架构凭借其高度的灵活性和可扩展性,成为众多企业重构后端系统的首选方案。本文将深入探讨微服务的核心概念、设计原则、关键技术选型及在实际项目实施过程中面临的挑战与解决方案,旨在为开发者提供一套实用的微服务架构落地指南。我们将从理论框架出发,逐步深入至技术细节,最终通过案例分析,揭示如何在复杂业务场景下有效应用微服务,提升系统的整体性能与稳定性。 ####
31 1
|
19天前
|
监控 安全 持续交付
构建高效微服务架构:策略与实践####
在数字化转型的浪潮中,微服务架构凭借其高度解耦、灵活扩展和易于维护的特点,成为现代企业应用开发的首选。本文深入探讨了构建高效微服务架构的关键策略与实战经验,从服务拆分的艺术到通信机制的选择,再到容器化部署与持续集成/持续部署(CI/CD)的实践,旨在为开发者提供一套全面的微服务设计与实现指南。通过具体案例分析,揭示如何避免常见陷阱,优化系统性能,确保系统的高可用性与可扩展性,助力企业在复杂多变的市场环境中保持竞争力。 ####
36 2
|
19天前
|
消息中间件 运维 API
后端开发中的微服务架构实践####
本文深入探讨了微服务架构在后端开发中的应用,从其定义、优势到实际案例分析,全面解析了如何有效实施微服务以提升系统的可维护性、扩展性和灵活性。不同于传统摘要的概述性质,本摘要旨在激发读者对微服务架构深度探索的兴趣,通过提出问题而非直接给出答案的方式,引导读者深入
38 1
|
20天前
|
负载均衡 监控 API
后端开发中的微服务架构实践与挑战
本文深入探讨了微服务架构在后端开发中的应用,分析了其优势和面临的挑战,并通过案例分析提出了相应的解决策略。微服务架构以其高度的可扩展性和灵活性,成为现代软件开发的重要趋势。然而,它同时也带来了服务间通信、数据一致性等问题。通过实际案例的剖析,本文旨在为开发者提供有效的微服务实施指导,以优化系统性能和用户体验。
|
20天前
|
弹性计算 Kubernetes API
构建高效后端服务:微服务架构的深度剖析与实践####
本文深入探讨了微服务架构的核心理念、设计原则及实现策略,旨在为开发者提供一套系统化的方法论,助力其构建灵活、可扩展且易于维护的后端服务体系。通过案例分析与实战经验分享,揭示了微服务在提升开发效率、优化资源利用及增强系统稳定性方面的关键作用。文章首先概述了微服务架构的基本概念,随后详细阐述了其在后端开发中的应用优势与面临的挑战,最后结合具体实例,展示了如何从零开始规划并实施一个基于微服务的后端项目。 ####
|
17天前
|
Cloud Native API 持续交付
云原生架构下的微服务治理策略与实践####
本文旨在探讨云原生环境下微服务架构的治理策略,通过分析当前面临的挑战,提出一系列实用的解决方案。我们将深入讨论如何利用容器化、服务网格(Service Mesh)等先进技术手段,提升微服务系统的可管理性、可扩展性和容错能力。此外,还将分享一些来自一线项目的经验教训,帮助读者更好地理解和应用这些理论到实际工作中去。 ####
34 0