微服务实践01--微服务管理11--缓存03--典型缓存架构设计

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

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

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

背景

前面介绍了缓存的设计方法,缓存技术,缓存方法等内容。本着本系列文章的一贯宗旨:理论结合实践,所以需要将理论知识真正的落地到实践中。本文主要说明在缓存实践中会遇到的问题以及这些问题的解决办法。

典型缓存架构(缓存设计模式)

对于缓存来说数据应该被怎样初始化、更新、失效、持久化都是问题,对于解决这些问题有前人总结出的架构模式帮我们解决。

  • 缓存设计模式

缓存设计模式中分为两类:Cache-Aside、Cache-As-SoR两类。这两类代表着对缓存使用方式的不同的认知。Cache-Aside代表缓存就是进行快速访问数据的过程。Cache-As-SoR代表缓存是一个数据存储系统,以数据存储系统的使用方式使用缓存技术。

Cache-Aside即业务代码围绕着Cache写,是由业务代码维护缓存。业务代码进行缓存的读写工作,读时使用击穿读,写使用双写方式完成。
Cache-As-SoR即把Cache看作为SoR,所有操作都是对Cache进行,然后Cache再委托给SoR进行真实的读/写。即业务代码中只看到Cache的操作,看不到关于SoR相关的代码。有是那种实现:Read Through, Write Through, Write Behind Caching。

在缓存系统内中有三个概念:

  • SoR(system-of-recode):记录系统,或者叫数据源,即实际存储原始数据的系统
  • Cache:缓存,是SoR的快照数据,Cache的访问速度比SoR要快,放入Cache的目的是提升访问速度,减少回溯的次数。
  • 回溯:即回到数据源头获取数据,Cache没命中时需要从SoR读取数据。

Cache-As-SoR的三种实现方式:

  • Read Through, 业务代码首先调用Cache,如果Cache不明中有Cache回溯到SoR,而不是业务代码(即由Cache读SoR)。Read Through的特点是业务代码与更新缓存代码分离,不像Cache-Aside模式那样更新缓存代码和SoR代码角质在一起。更利于缓存代码的统一维护。
  • Write Through, 被成为穿透写/直写模式--业务代码首先调用Cache写(新增/修改)数据,然后有Cache负责写缓存和写SoR,不用业务代码去写。Write Through的特点和Read Through相仿,不过从查询时发生变为在更新数据时发生。
  • Write Behind Caching,又叫Write Back。一些了解Linux操作系统内核的同学对Write Back应该非常熟悉,这不就是Linux文件系统的Page Cache的算法吗?是的,你看基础这玩意全都是相通的。Write Back与Write Through不同之处在于Write Back是异步写的。说明白点就是在更新数据的时候,只更新缓存,不更新数据库,而我们的缓存会异步地批量更新数据库。Write Back的特点是让数据的I/O操作飞快无比(因为直接操作内存嘛 ),因为异步,write backg还可以合并对同一个数据的多次操作,所以性能的提高是相当可观的。
  • 技术选型

技术 Jetedis Guava Cache Ehcache3.x
Cache-Aside 支持 支持 支持
Read Through 不支持 支持 支持
Write Through 不支持 不支持 支持
Write Behind Caching 不支持 不支持 支持

对于Cache-Aside,可能存在并发更新情况,即如果多个应用实例同时更新那么缓存怎么办?下一节就说明相关的关注点。

缓存架构关注点

在缓存真正落地时可能会遇到的问题、以及这些问题的解决方法与理论有一定的隔阂,不过这种隔阂可以考验我们的设计与架构能力。也考验我们深度思考的能力。

  • Dog Pile Effect

在缓存系统中,缓存总有失效的时候,比如我们经常使用的 Memcache 和 Redis ,都会设置超时时间;而一旦缓存到了超时时间失效之后,如果此时再有大量的并发向数据库发起请求,就会造成服务器卡顿甚至是系统当机。这就是 Dog Pile Effect 。可以使用Read Though模式进行解决。

  • 击穿

当请求了缓存中没有的数据时或当缓存服务挂掉时,这时候就会回源到DB里面。此时如果黑客故意对上面数据发起大量请求,则DB有可能会挂掉,这就是缓存击穿。当然缓存挂掉的话,正常的用户请求也有可能造成缓存击穿的效果。
最简单的方式处理缓存击穿问题:缓存永不过期。真正的缓存过期时间不有Redis控制,而是由程序代码控制。当获取数据时发现数据超时时,就需要发起一个异步请求去加载数据。符合Write Back模式。

  • 可靠性

在缓存宕机的情况下,为了保证服务能够正常的提供服务最好的方式是使用多级缓存的本地缓存进行暂时数据保存。在这其中有两种方式选择:白名单、布隆过滤器(Bloom Filter)。
白名单顾名思义就是:在缓存宕机之前的一段时间里,会将请求的数据在系统中的有无,记录在一个Map中。当缓存宕机后,首先在Map中判断是否含有数据,有则回源DB,没有的话就直接返回结果。
Bloom Filter实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。

  • 线程安全

保证线程安全的模式Copy Pattern。Copy Pattern包括两种Copy-On-Read(在读时复制)和Copy-On-Write(在写实复制),很多本地缓存技术都是基于堆缓存中对象饮用方式。这样就会导致如果有一个请求获取了缓存数据并修改它,则可能发生不可预测的问题。所以,就需要使用COR或COW进行。

解决方案

对于缓存系统来说就是为了提高系统的并发能力。在前面几篇文章过后大家也对缓存系统有了深入的认知,在此基础上提出一个终极缓存架构设计方案:
缓存终极架构

在上面的架构中将OpenResty和Redis推到最前端,将服务押后到Redis之后。对于分布式缓存,我们需要在OpenResty应用中尽享应用混存来减少Redis集群的访问冲击,即首先查询OpenResty本地缓存,如果命中则直接返回,如果没有则接着查询Redis集群,如果在没有则进行回溯查询。

架构中将Redis视为存储,而非缓存。使用几乎全量缓存的方式,将数据加入到缓存系统中。每个请求直接使用Nginx缓存或Redis缓存进行返回,不需要通过任何后台服务、数据库即可完成请求的处理。这样最大限度的降低请求处理时间,最大限度的加大并发数。

  • CQRS

综上所有的几乎就是一个CQRS系统。将该隔离的隔离开,将该耦合的耦合上去。这样就能更好的帮助我们形成一个完善的缓存架构。
CQRS

总结

缓存是支持高并发的已经很好的处理方式。不过要使用好缓存还是很考验研发人员能力的。从使用Redis、Memcache作为存储使用,还是作为缓存使用就是可以区分出一个人对于缓存的认知。所以,不要对任何一门技术设限,他不应该只是它本来擅长的位置体现作用。应该将技术扩展到其他可以满足技术特性的场景中去。

参考

缓存双写不一致问题
分布式缓存击穿(布隆过滤器 Bloom Filter)
缓存更新的套路
不懂多级缓存的分层架构?那就看看这个吧!
CDN的本质—大规模分布式多级缓存系统
如何处理 Dog Pile Effect
CQRS实践(1): 什么是CQRS
OpenResty® - 中文官方站

相关实践学习
基于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
目录
相关文章
|
9天前
|
监控 Java 持续交付
后端开发中的微服务架构实践与挑战####
在当今快速迭代的软件开发领域,微服务架构以其灵活性和可扩展性成为众多企业的首选。本文探讨了微服务架构的核心概念、实施策略及面临的主要挑战,旨在为后端开发者提供一个全面的指南。通过分析真实案例,揭示微服务在提升系统敏捷性的同时,如何有效应对分布式系统的复杂性问题。 ####
|
3天前
|
缓存 负载均衡 API
后端开发中的微服务架构实践与挑战####
在数字化转型的浪潮中,微服务架构凭借其高度的可扩展性、灵活性及易于维护的特点,成为众多企业后端开发的首选架构模式。本文将深入探讨微服务架构的核心理念,通过具体案例分析其在实际应用中的实践策略与面临的挑战,为读者提供一份详尽的微服务架构实施指南。 ####
|
3天前
|
监控 持续交付 API
深入理解微服务架构:从设计原则到实践应用
深入理解微服务架构:从设计原则到实践应用
|
5天前
|
消息中间件 负载均衡 测试技术
后端开发中的微服务架构实践与挑战####
本文旨在探讨微服务架构在后端开发中的应用实践,深入分析其带来的优势与面临的挑战。通过剖析真实案例,揭示微服务转型过程中的关键技术决策、服务拆分策略、以及如何有效应对分布式系统的复杂性问题。文章还将提供一套评估企业是否适合采用微服务架构的框架,帮助读者更好地理解这一架构模式,并为企业的技术选型提供参考。 ####
|
3天前
|
运维 监控 安全
深入理解微服务架构:设计原则、挑战与实践
深入理解微服务架构:设计原则、挑战与实践
|
9天前
|
消息中间件 监控 安全
后端架构演进:从单体到微服务####
在数字化转型的浪潮中,企业应用的后端架构经历了从传统单体架构到现代微服务架构的深刻变革。本文探讨了这一演进过程的背景、驱动力、关键技术及面临的挑战,揭示了如何通过微服务化实现系统的高可用性、扩展性和敏捷开发,同时指出了转型过程中需克服的服务拆分、数据管理、通信机制等难题,为读者提供了一个全面理解后端架构演变路径的视角。 ####
26 8
|
8天前
|
Cloud Native Devops 持续交付
云原生架构的演进与实践
本文深入探讨了云原生架构的核心概念、技术组件及其在现代软件开发中的应用。通过分析容器化、微服务、持续集成/持续部署(CI/CD)等关键技术,揭示了这些技术如何共同促进应用程序的灵活性、可扩展性和高可用性。文章还讨论了云原生架构实施过程中面临的挑战和最佳实践,旨在为开发者和企业提供一套实用的指导方针,以便更有效地利用云计算资源,加速数字化转型的步伐。
23 5
|
10天前
|
Cloud Native 安全 API
云原生架构下的微服务治理策略与实践####
—透过云原生的棱镜,探索微服务架构下的挑战与应对之道 本文旨在探讨云原生环境下,微服务架构所面临的关键挑战及有效的治理策略。随着云计算技术的深入发展,越来越多的企业选择采用云原生架构来构建和部署其应用程序,以期获得更高的灵活性、可扩展性和效率。然而,微服务架构的复杂性也带来了服务发现、负载均衡、故障恢复等一系列治理难题。本文将深入分析这些问题,并提出一套基于云原生技术栈的微服务治理框架,包括服务网格的应用、API网关的集成、以及动态配置管理等关键方面,旨在为企业实现高效、稳定的微服务架构提供参考路径。 ####
35 5
|
9天前
|
Kubernetes API Docker
构建高效后端服务:微服务架构的深度实践与优化####
本文深入探讨了微服务架构在现代后端开发中的应用,通过剖析其核心概念、设计原则及实施策略,结合具体案例分析,展示了如何有效提升系统的可扩展性、可靠性和维护性。文章还详细阐述了微服务拆分的方法论、服务间通信的最佳实践、以及容器化与编排工具(如Docker和Kubernetes)的应用技巧,为读者提供了一份全面的微服务架构落地指南。 ####
|
7天前
|
测试技术 持续交付 微服务
深入理解微服务架构:从概念到实践
深入理解微服务架构:从概念到实践
下一篇
无影云桌面