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

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: 微服务实践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
目录
相关文章
|
28天前
|
弹性计算 API 持续交付
后端服务架构的微服务化转型
本文旨在探讨后端服务从单体架构向微服务架构转型的过程,分析微服务架构的优势和面临的挑战。文章首先介绍单体架构的局限性,然后详细阐述微服务架构的核心概念及其在现代软件开发中的应用。通过对比两种架构,指出微服务化转型的必要性和实施策略。最后,讨论了微服务架构实施过程中可能遇到的问题及解决方案。
|
28天前
|
Java 开发者 微服务
从单体到微服务:如何借助 Spring Cloud 实现架构转型
**Spring Cloud** 是一套基于 Spring 框架的**微服务架构解决方案**,它提供了一系列的工具和组件,帮助开发者快速构建分布式系统,尤其是微服务架构。
154 69
从单体到微服务:如何借助 Spring Cloud 实现架构转型
|
27天前
|
运维 监控 持续交付
微服务架构解析:跨越传统架构的技术革命
微服务架构(Microservices Architecture)是一种软件架构风格,它将一个大型的单体应用拆分为多个小而独立的服务,每个服务都可以独立开发、部署和扩展。
163 36
微服务架构解析:跨越传统架构的技术革命
|
30天前
|
设计模式 负载均衡 监控
探索微服务架构下的API网关设计
在微服务的大潮中,API网关如同一座桥梁,连接着服务的提供者与消费者。本文将深入探讨API网关的核心功能、设计原则及实现策略,旨在为读者揭示如何构建一个高效、可靠的API网关。通过分析API网关在微服务架构中的作用和挑战,我们将了解到,一个优秀的API网关不仅要处理服务路由、负载均衡、认证授权等基础问题,还需考虑如何提升系统的可扩展性、安全性和可维护性。文章最后将提供实用的代码示例,帮助读者更好地理解和应用API网关的设计概念。
63 8
|
30天前
|
运维 监控 Java
后端开发中的微服务架构实践与挑战####
在数字化转型加速的今天,微服务架构凭借其高度的灵活性、可扩展性和可维护性,成为众多企业后端系统构建的首选方案。本文深入探讨了微服务架构的核心概念、实施步骤、关键技术考量以及面临的主要挑战,旨在为开发者提供一份实用的实践指南。通过案例分析,揭示微服务在实际项目中的应用效果,并针对常见问题提出解决策略,帮助读者更好地理解和应对微服务架构带来的复杂性与机遇。 ####
|
30天前
|
算法 NoSQL Java
微服务架构下的接口限流策略与实践#### 一、
本文旨在探讨微服务架构下,面对高并发请求时如何有效实施接口限流策略,以保障系统稳定性和服务质量。不同于传统的摘要概述,本文将从实际应用场景出发,深入剖析几种主流的限流算法(如令牌桶、漏桶及固定窗口计数器等),通过对比分析它们的优缺点,并结合具体案例,展示如何在Spring Cloud Gateway中集成自定义限流方案,实现动态限流规则调整,为读者提供一套可落地的实践指南。 #### 二、
55 3
|
28天前
|
消息中间件 运维 安全
后端开发中的微服务架构实践与挑战####
在数字化转型的浪潮中,微服务架构凭借其高度的灵活性和可扩展性,成为众多企业重构后端系统的首选方案。本文将深入探讨微服务的核心概念、设计原则、关键技术选型及在实际项目实施过程中面临的挑战与解决方案,旨在为开发者提供一套实用的微服务架构落地指南。我们将从理论框架出发,逐步深入至技术细节,最终通过案例分析,揭示如何在复杂业务场景下有效应用微服务,提升系统的整体性能与稳定性。 ####
39 1
|
30天前
|
监控 安全 持续交付
构建高效微服务架构:策略与实践####
在数字化转型的浪潮中,微服务架构凭借其高度解耦、灵活扩展和易于维护的特点,成为现代企业应用开发的首选。本文深入探讨了构建高效微服务架构的关键策略与实战经验,从服务拆分的艺术到通信机制的选择,再到容器化部署与持续集成/持续部署(CI/CD)的实践,旨在为开发者提供一套全面的微服务设计与实现指南。通过具体案例分析,揭示如何避免常见陷阱,优化系统性能,确保系统的高可用性与可扩展性,助力企业在复杂多变的市场环境中保持竞争力。 ####
42 2
|
30天前
|
消息中间件 运维 API
后端开发中的微服务架构实践####
本文深入探讨了微服务架构在后端开发中的应用,从其定义、优势到实际案例分析,全面解析了如何有效实施微服务以提升系统的可维护性、扩展性和灵活性。不同于传统摘要的概述性质,本摘要旨在激发读者对微服务架构深度探索的兴趣,通过提出问题而非直接给出答案的方式,引导读者深入
45 1
|
30天前
|
负载均衡 监控 API
后端开发中的微服务架构实践与挑战
本文深入探讨了微服务架构在后端开发中的应用,分析了其优势和面临的挑战,并通过案例分析提出了相应的解决策略。微服务架构以其高度的可扩展性和灵活性,成为现代软件开发的重要趋势。然而,它同时也带来了服务间通信、数据一致性等问题。通过实际案例的剖析,本文旨在为开发者提供有效的微服务实施指导,以优化系统性能和用户体验。