微服务架构,如何做分布式,通用缓存机制?

分布式微服务架构 随着业务的不断发展, 用户体量的快速扩张. 从单体/垂直架构转移到分布式/微服务架构是自然而然的选择. 01分布式理论 分布式理论是分布式系统的基础, 在任何情况下分布式系统都要满足网络分区容错性, 因此分布式系统都是在可用性和一致性方面做平衡. 02CAP理论 CAP理论指的是在一个分布式系统中,一致性、 可用性、分区容错性、在任何情况下只能满足其中两个,三个不能同时满足. 三个特性含义如下: Consistency(一致性)指数据在多个副本之间能够保持一致的... 阅读详情

点击上方“芋道源码”,选择“设为星标”

做积极的人,而不是积极废人!

源码精品专栏

 

来源:波斯码 cnblogs.com/bossma/p/9858847.html

  • 什么是静态数据

  • 最新粉丝福利

  • 为什么需要缓存

  • 通用缓存机制

  • 总结

  • 后记


在分布式系统中,特别是最近很火的微服务架构下,有没有或者能不能总结出一个业务静态数据的通用缓存处理机制或方案,这篇文章将结合一些实际的研发经验,尝试理清其中存在的关键问题以及探寻通用的解决之道。

什么是静态数据

这里静态数据是指不经常发生变化或者变化频率比较低的数据,比如车型库、用户基本信息、车辆基本信息等,车型库这种可能每个月会更新一次,用户和车辆基本信息的变化来源于用户注册、修改,这个操作的频率相对也是比较低的。

最新粉丝福利

另外这类数据的另一个特点是要求准确率和实时性都比较高,不能出现丢失、错误,以及过长时间的陈旧读。

具体是不是应该归类为静态数据要看具体的业务,以及对变化频率高低的划分标准。在这里的业务定义中,上边这几类数据都归为静态数据。

为什么需要缓存

在面向用户或车联网的业务场景中,车型信息、用户基本信息和车辆基本信息有着广泛而高频的业务需求,很多数据都需要对其进行关联处理。在这里缓存的目的就是为了提高数据查询效率。静态数据通常都保存在关系型数据库中,这类数据库的 IO 效率普遍不高,应对高并发的查询往往捉襟见肘。使用缓存可以极大的提升读操作的吞吐量,特别是 KV 类的缓存,没有复杂的关系操作,时间复杂度一般都在 O(1)。注意这里说的缓存指内存缓存。

当然除了使用缓存,还可以通过其它手段来提高 IO 吞吐量,比如读写分离,分库分表,但是这类面向关系型数据库的方案更倾向于同时提高读写效率,对于单纯提升读吞吐量的需求,这类方案不够彻底,不能在有限的资源情况下发挥更好的作用。

通用缓存机制

下面将直接给出一个我认为的通用处理机制,然后会对其进行分析。

对于某个具体的业务,其涉及到六个核心程序:

业务服务: 提供对某种业务数据的操作接口,比如车辆服务,提供对车辆基本信息的增删改查服务。

关系数据库: 使用若干表持久化业务数据,比如 SQLServer、MySQL、Oracle 等。

持久化队列: 可独立部署的队列程序,支持数据持久化,比如 RabbitMQ、RocketMQ、Kafka 等。

缓存处理程序: 从队列接收数据,然后写入缓存。

数据一致处理程序: 负责检查缓存数据库和关系型数据库中数据是否一致,如果不一致则使用关系数据库进行更新。

缓存数据库(Redis): 支持持久化的缓存数据库,这里直接选了 Redis,这个基本是业界标准了。

以及两个外部定义:

数据生产者:业务静态数据的来源,可以理解为前端 APP、Web 系统的某个功能或者模块。

数据消费者:需要使用这些业务静态数据的服务或者系统,比如报警系统需要获取车辆对应的用户信息以便发送报警。

下面以问答的形式来说明为什么是这样一种机制。

为什么需要业务服务?

既然是微服务架构,当然离不开服务了,因为这里探讨的是业务静态数据,所以是业务服务。不过为了更好的理解,这里还是简单说下服务出现的原因。

当今业务往往需要在多个终端进行使用,比如 PC、手机、平板等,既有网页的形式,又有 APP 的形式,另外某个数据可能在多种不同的业务被需要,如果将数据操作分布在多个程序中很可能产生数据不一致的情况,另外代码不可避免的冗余,读写性能更很难控制,变更也基本上是不敢变的。通过一个业务服务可以将对业务数据的操作有序的管理起来,并通过接口的形式对外提供操作能力,代码不用冗余了,性能也好优化了,数据不一致也得到了一定的控制,编写上层应用的人也舒服了。

为什么不是进程内缓存?

很多开发语言都提供了进程内缓存的支持,即使没有提供直接操作缓存的包或库,也可以通过静态变量的方式来实现。对数据的查询请求直接在进程内存完成,效率可以说是杠杠滴了。但是进程内缓存存在两个问题:

缓存数据的大小:进程可以缓存数据的大小受限于系统可用内存,同时如果机器上部署了多个服务,某个服务使用了太多的内存,则可能会影响其它服务的正常访问,因此不适合大量数据的缓存。

缓存雪崩:缓存同时大量过期或者进程重启的情况下,可能产生大量的缓存穿透,过多的请求打到关系数据库上,可能导致关系数据库的崩溃,引发更大的不可用问题。

为什么是 Redis?

Redis 这类数据库可以解决进程内缓存的两个问题:

1、 独立部署,不影响其它业务,还可以做集群,内存扩容比较方便。

2、 支持数据持久化,即使 Redis 重启了,缓存的数据自身就可以很快恢复。

另外 Redis 提供了很好的读写性能,以及方便的水平扩容能力,还支持多种常用数据结构,使用起来比较方便,可以说是通用缓存首选。

为什么需要队列?

队列在这里的目的是为了解耦,坦白的说这个方案中可以没有队列,业务服务在关系数据库操作完成后,直接更新到缓存也是可以的。之所以加上这个队列是由于当前的业务开发有很明显的系统拆分的需求,特别是在微服务架构下,为了降低服务之间的耦合,使用队列是个常用选择,在某些开发模型中也是很推崇的,比如 Actor 模型。

举个例子,比如新注册一个用户,需要赠送其 300 积分,同时还要给其发个注册成功的邮件,如果将注册用户、赠送积分、发成功邮件都写到一起执行,会产生两个问题:一是注册操作耗时增加,二是其中某个处理引发整体不可用的几率增大,三是程序的扩展性不好;通多引入队列,将注册信息分别发到积分队列和通知队列,然后由积分模块和通知模块分别处理,用户、积分、通知三个模块的耦合降低了,相互影响变小了,以后再增加注册后的其它处理也就是增加个队列的事,整体的扩展性得到了增强。

队列作为一种常用的解耦方案,在缓存这里虽然产生的影响不大,但是除了缓存难免同时还会有其它业务处理,所以为了统一处理机制,这里保留了下来。(既然用了,就把它发扬光大。)

为什么队列需要持久化?

持久化是为了解决网络抖动或者崩溃导致数据丢失的问题,在数据从业务服务到队列,队列自身处理,再从队列到缓存处理程序,中间都可能丢失数据。为了解决丢失数据的问题,需要发送时确认、队列自身持久化、接收时确认;但是需要注意确认机制可能会导致重复数据的产生,因为在未收到确认时就需要重新发送或接收,而数据实际上可能被正常处理,只是确认丢失了;确认机制还会降低队列的吞吐量,但是根据我们的定义业务静态数据的变更频率应该不高,如果同时还需要较高的并发分片是个不错的选择。

这里持久化队列推荐选择 RabbitMQ,虽然吞吐量支持的不是很大,但是各方面综合不错,并发够用就好。

为什么需要数据一致检查程序?

在业务服务操作完关系数据库后,数据发送到队列之前(或者不用队列就是直接写入缓存之前),业务服务崩溃了,这时候数据就不能更新到缓存了。还有一种情况是 Redis 发生了故障转移,master 中的更新没有同步到 slaver。通过引入这么一个检查程序,定时的检查关系数据库数据和缓存数据的差别,如果缓存数据比较陈旧,则更新之。这样提供了一种极端情况下的挽救措施。

这个检查程序的运行频率需要综合考虑数据库压力和能够承受的数据陈旧时间,不能把数据库查死了,也不能陈旧太久导致大量数据不一致。可以通过设置上次检查时间点的方式,每次只检查从上次检查时间点(或者最近几次,防止 Redis 故障转移数据未同步的问题)到本次检查时间点发生变更的数据,这样每次检查只对增量变更,效率更高。

同时需要理解在分布式系统中,微服务架构下,数据不一致是经常出现的,必须在一致性和可用性之间做出权衡,尽力去降低影响,比如使用准实时或最终一致性。

只要数据一致检查程序是不是就够了?

假设没有缓存处理程序,通过定时同步关系数据库和缓存数据库是不是就够了呢?这还是取决于业务,如果是车型库这种数据,增加一个新的车型,本来之前就没有,时间上并不是很敏感,这个是可以的。但是对于新增了用户或者车辆,数据消费者还是希望能够马上使用最新的数据进行处理,越快越好,这时使用同步或者准同步更新就能更加贴近需求。

为什么不用缓存过期机制?

使用缓存过期机制可以不需要缓存处理程序和数据一致检查程序,业务服务首先从 Redis 查询数据,如果数据存在就直接返回,如果不存在则从关系数据库查询,然后写入 Redis,然后再返回,这也是一种常用的缓存处理机制,网上可以查询到很多,很多人用的也很好。

但是缓存的过期时间是个问题:缓存多长时间过期,设置的短可以降低数据的陈旧,但是会增加缓存穿透的概率,即使采用随机的缓存过期时间,在 Redis 重启或者故障转移的情况下还是会可能导致缓存雪崩,雪崩的情况下采用数据预热机制,也可能会导致服务更长时间的不可用;设置的长可以提升缓存的使用率,但是增加了数据陈旧,在上边对静态数据的定义中对其准确率和实时性都有较高的要求,业务上能不能接受需要考虑。而且如果操作数据和查询存在波动的峰谷,是不是要引入动态 TTL 的机制,以达到缓存使用和直接访问数据库的一种平衡,这就需要权衡业务需求和技术方案。

总结

通过上边的这些问题问答,再来看看上面提出的微服务架构下静态数据通用缓存处理机制。

1、 通过业务服务来包装对数据的操作,不管是操作关系数据库还是缓存数据库,数据消费者其实不需要关心,它只关心业务服务能不能提供高并发实时数据的查询能力

2、 利用分布式系统中经常使用队列进行解耦的方式,业务服务不干写入缓存的事,增加一个队列订阅数据变更,然后从队列取数据写入缓存数据库。

3、 对于绝大部分正常的情况,通过队列更新缓存数据和业务服务中更新缓存数据,其实时性是差不多的,同时实现了业务操作和写缓存的解耦。

4、 在极端崩溃导致数据不一致的情况下,通过数据一致检查程序进行补救,尽快更新缓存数据。

5、 现在业务服务可以通过访问 Redis 缓存来提供对静态数据的高并发准实时查询能力,缓存中不存在的数据就是不存在,没有缓存穿透。

对于微服务架构而言,这个机制借助队列这种通用的解耦方式,独立了缓存更新处理,通过准实时更新和定时检查,保证了缓存的实时性和极端情况下较短时间内达到最终一致,通过缓存的持久化机制消除了缓存穿透和雪崩,在缓存的数据较大或读取并发较高时支持水平扩容,可以认为对业务静态数据提供了一种广泛适用的缓存处理机制。

这个方案在某些情况下可能是没有必要的,比如你要缓存一个全国限行的城市列表,使用一个进程内缓存就够了。

最后剩下的就是工作量的问题了,这个会给开发和维护带来复杂性,队列有没有用的顺手的,人手是不是够,业务需求是什么样的,需要考虑清楚。

后记

Redis 耦合问题: 图中业务服务直接访问了 Redis,如果要实现业务服务对 Redis 的完全透明,这个还比较复杂,可以考虑采用 AOP 的方式,对关系数据库和 Redis 保持相同的类型定义,分别采用 ORM 和反序列化的方式标准化输出,这是个想法我也没有实现;同时缓存数据是准实时的,如果要求完全一致,还是应该提供从关系数据库查询的版本。另外如果要摆脱对 Redis 的直接依赖,还可以通过 OpenResty 来实现对资源的透明访问,这个不是本文的重点。

服务可用性问题: 这篇文章没有关注服务可用性问题,为了保证服务的高可用,每个服务或者程序都应该有多份部署的,无论是负载均衡的方案,或者传统的主备方案,在部分部署不可用时仍能够继续提供服务。

写的比较快,有些理解不免偏颇,欢迎指正。



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:

已在知识星球更新源码解析如下:


最近更新《芋道 SpringBoot 2.X 入门》系列,已经 20 余篇,覆盖了 MyBatis、Redis、MongoDB、Elasticsearch、分库分表、读写分离、SpringMVC、SpringWebflux、WebSocket、性能测试等等内容。

提供近 2W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

如果你喜欢这篇文章,喜欢,转发。

生活很美好,明天见(。・ω・。)ノ♡

常用的后端性能优化六种方式:缓存化+服务化+异步化等 立即下载

相关推荐

三端口DC-DC变换器设计与光伏储能协同控制

三端口DC-DC变换器是面向分布式能源系统的关键功率变换拓扑,通过在光伏输入、储能电池与直流负载三个端口间实现动态能量分配,解决多源异步供电下的电压稳定与功率平衡问题。其核心原理基于双Boost半桥架构与双闭环协同控制,融合MPPT最大功率点跟踪与电池智能充放电管理,在保证30V高精度稳压(±0.5V)的同时,支持光伏主导供电与电池支撑供电的自动模式切换。该技术显著提升光储系统能量利用率与供电连续性,广泛应用于微电网、便携式交直流电源及离网型光储一体机等场景,是构建柔性直流配电与智能能源管理的基础硬件单元。

weixin_36431814的博客 141

编写程序实现文件的分布式存储

系统的结构: 多个客户端程序,FileClient应用。客户端程序可以向文件服务节点的应用程序上传文,下载文件,删除文件。(不考虑文件夹与文件名重名) 一个FileServe应用,提供文件存储节点StorageNode的管理功能,提供文件的管理功能。 多个StorageNode应用,提供文件的存储能力。提供向备份节点服务器进行文件备份功能。 一个监控程序 系统功能细节 NodeName=aName

志博云天 2011

Nginx反向代理MinIO私有桶签名失效?一招解决Host头校验问题

本文详细解析了Nginx反向代理MinIO私有桶时出现的签名失效问题,重点解决了Host头校验导致的"SignatureDoesNotMatch"错误。通过精准配置proxy_set_header保持Host头一致性,并提供了二级目录代理和调试指南,帮助开发者高效解决这一常见技术难题。

weixin_29201313的博客 321

【微服务全家桶】-高级篇-3-分布式缓存Redis

【微服务全家桶】-高级篇-3-分布式缓存Redis

bblb的博客 1139

飞控算法-姿态解算之互补滤波

飞控乱入之姿态解算 姿态解算是通过读取各个传感器的数据进行融合最终得到当前飞行器的姿态,姿态通常用Euler角(Roll-Pitch-Yaw)来表示 姿态解算框架 姿态解算的数据源可来自于陀螺仪或加速度计,他们分别都可以得到当前姿态,但实际上他们都有各自的传感器性能的优缺点,需要取长补短,进行数据融合才能得到真实的姿态,这种方法简称 互补滤波 算法 传感器特性 互补滤波 姿态解...

GoolyOh的专栏 1万+

PAM4信号测试实战:从眼图分析到误码率测量的技术演进

在高速数字系统设计中,信号完整性测试是确保数据传输可靠性的核心环节。其基本原理在于通过时域和频域分析,精确评估信号在传输过程中的质量衰减与失真。随着数据速率向56Gbps及以上演进,传统的NRZ编码面临带宽瓶颈,而PAM4调制技术通过在每个符号周期内承载更多比特信息,成为提升信道效率的关键路径。这项技术的工程价值在于,它允许在相同带宽下实现翻倍的数据吞吐量,这对于数据中心互联、PCIe 6.0及800G以太网等高速接口至关重要。然而,PAM4信号电平间距更小,对噪声和抖动极为敏感,导致其原始误码率显著升高,

weixin_42522817的博客 657

Redis数据库在分布式缓存中的应用研究

本文主要讲解用Redis数据库作为分布式缓存应用,并给出了简洁高效的.NET Redis Client实现源码。

末小渝的博客 1648

【以太网硬件一】802.3xx标准怎么这么多?它们有什么关系?

IEEE 802.3标准发展历史简介

highman110的博客 5017

黑马微服务高级篇分布式缓存

基于Redis集群解决单机Redis存在的问题

study-java 821

寄存器与计数器设计(Verilog)

always @(posedge Reset or posedge Clock)//请在括号中补充敏感信号列表。always @(negedge Resetn , posedge Clock)//请在括号中补充敏感信号列表。always @(negedge Resetn,posedge Clock)//请在括号中补充敏感信号列表。//为了便于自动评测,请勿更改n的值。//为了便于自动评测,请勿更改n的值。//为了便于自动评测,请勿更改n的值。//为了便于自动评测,请勿更改n的值。

M_inherit的博客 362

机器人中的数值优化(十四)——罚函数法(Penalty Method)、障碍函数法(Barrier Method)、拉格朗日松弛法(Lagrangian Relaxation)

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,下半部分介绍带约束的优化,中间会穿插一些路径规划方面的应用实例

慕羽★的博客 5217

微服务 - Redis缓存 · 数据结构 · 持久化 · 分布式 · 高并发

在单站点中,可以将在线用户信息存储在Session中,随时变更获取信息;在多站点分布式集群如何做到Session共享呢?架设一个Session服务,供多服务使用。频繁使用的数据存在DB端,频繁的DB连接,频繁的IO;数据存于内存中更能减少性能的消耗,更能提高使用效率。集群化分布式时,为解决以上现象,建立缓存服务显得尤为重要。

xxxzzzqqq_的博客 248

推荐系统(十六):基于ESMM的商品召回/推荐系统

ESMM(Entire Space Multi-Task Model)是阿里巴巴提出的多任务学习框架,通过联合建模点击率(CTR)和点击转化率(CVR)解决传统CVR模型样本稀疏问题。其核心思想是将 CVR 定义为 CTR 与 CTCVR 的条件概率,模型包含两个子任务。

Jin_Kwok的博客 1265

架构高并发方案_架构 - 抖音微博等短视频千万级高可用、高并发架构设计

本文从设计及服务可用性方面,详细解析了微博短视频高可用、高并发架构设计中的问题与解决方案。今天与大家分享的是微博短视频业务的高并发架构,具体内容分为如下三个方面:团队介绍微博视频业务场景“微博故事”业务场景架构设计团队介绍我们是隶属于微博研发部视频平台研发部门的技术团队。平台研发是微博的核心部门之一,包括大家熟知的微博视频在内的微博所有核心业务的基础平台架构、用户关系体系等都依赖微博平台研发部门的...

weixin_42138408的博客 576

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Go语言面试核心考点与实战技巧

并发编程和系统性能优化是现代后端开发的核心技术领域,尤其在Go语言生态中更为突出。GMP模型作为Go调度器的核心架构,通过Processor、Machine和Goroutine的协同实现高效并发。理解channel的缓冲机制与select语句配合,能有效解决生产者-消费者等经典并发问题。在工程实践中,内存分析工具pprof和GC调优参数GOGC的运用,可显著提升服务性能。本文结合面试高频场景,详解如何通过sync.Pool减少内存分配、设计带TTL的本地缓存等实战方案,这些技巧在云计算和微服务架构中具有广泛

weixin_29300241的博客 290

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

架构方案(8) 微服务架构下静态数据通用缓存机制

在分布式系统中,特别是最近很火的微服务架构下,有没有或者能不能总结出一个业务静态数据的通用缓存处理机制或方案,这篇文章将结合一些实际的研发经验,尝试理清其中存在的关键问题以及探寻通用的解决之道。 什么是静态数据 这里静态数据是指不经常发生变化或者变化频率比较低的数据,比如车型库、用户基本信息、车辆基本信息等,车型库这种可能每个月会更新一次,用户和车辆基本信息的变化来源于用户注册、修改,这个操作的频...

cowbin2012的专栏 1万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

分布式微服务架构体系详解

课程介绍 微服务架构的技术体系、社区目前已经越来越成熟。在最初系统架构的搭建,或者当现有架构已到达瓶颈需要进行架构演进时,很多架构师、运维工程师会考虑是否需要搭建微服务架构体系。虽然很多文章都说微服务架构是复杂的、会带来很多分布式的问题,但只要我们了解这些问题,并找到解法,就会有种拨开云雾的感觉。 微服务架构也不是完美的,世上没有完美的架构,微服务架构也是随着业务、团队成长而不断演进的。最开始可能...

GitChat 6万+

微服务架构下的静态数据通用缓存机制

什么是静态数据 为什么需要缓存 通用缓存机制 总结 后记 在分布式系统中,特别是最近很火的微服务架构下,有没有或者能不能总结出一个业务静态数据的通用缓存处理机制或方案,这篇文章将结合一些实际的研发经验,尝试理清其中存在的关键问题以及探寻通用的解决之道。 什么是静态数据 这里静态数据是指不经常发生变化或者变化频率比较低的数据,比如车型库、用户基本信息、车辆基本信息等,车型库这种可能每个月会更新一次,...

Tom_sensen的博客 192

微服务架构下静态数据通用缓存机制

点击上方“方志朋”,选择“设为星标”回复”666“获取新整理的面试文章来源 |my.oschina.net/u/3971241/blog/2254252在分布式系统中,特别是最近很火...

方志朋的博客 101

推荐项目:Paperwork - 开源自托管笔记管理神器

Paperwork 是一款开源、可自托管的笔记应用,作为 Evernote、OneNote 和 Google Keep 的隐私替代方案,把数据完全交还给你自己。如果你在处理敏感资料,或者受够了第三方网盘的"数据托管",它就是为你准备的自托管笔记工具。 ## 😩 敏感笔记放在别人服务器上,你睡得着吗 想象一下:你整理了一份还没发表的调研数据,随手丢进了某个云端笔记应用。几周后看到它的隐私条款更

gitblog_00645的博客 873

分布式微服务--单体架构 ,垂直架构 ,分布式架构 ,SOA ,微服务 以及他们之间的演变过程

本文系统梳理了软件架构的演进历程:从单体架构(简单但扩展性差)、垂直架构(业务解耦但功能冗余)、分布式架构(性能提升但耦合度高)、SOA架构(ESB中心化管理)、到微服务架构(去中心化、细粒度服务)。重点分析了Dubbo在SOA和微服务中的双重角色,以及Zookeeper作为注册中心与ESB的本质区别。架构演进的核心逻辑是:通过不断解耦和分布式治理来应对系统复杂度提升,最终形成以微服务为代表的云原生架构体系。

你我约定有三的博客 1343

Dubbo缓存机制:本地缓存与分布式缓存集成

你是否还在为分布式系统中的重复请求导致服务响应延迟而烦恼?是否在寻找一种既能减轻服务端压力又能提升客户端响应速度的解决方案?本文将深入解析Dubbo(分布式服务框架)的缓存机制,从本地缓存到分布式缓存集成,帮助你全面掌握如何在实际项目中配置和优化缓存策略,解决高并发场景下的数据访问性能瓶颈。读完本文,你将能够: - 理解Dubbo缓存机制的核心原理与执行流程 - 掌握4种本地缓存(LRU/LFU...

gitblog_00050的博客 675

微服务架构图_微服务技术基础——分布式架构的演化史

现在的分布式架构非常复杂,但这也是从一些简单的应用开始,随着业务复杂和高技术要求,逐步形成的。下面就简单回顾一下分布式架构的演化过程。1.C/S架构模式C/S模式分为客户端应用程序和服务器端应用程序。客户端负责业务处理,而服务器端负责数据存储。通信完全依赖ODBC或者专用的数据库驱动内置通信组件。如图1所示。图1C/S模式架构图特征:应用程序步骤在一台PC机上,而数据库或文件等所有的...

weixin_39649965的博客 1116
上一篇: 分布式链路追踪 SkyWalking 源码分析 —— Agent 发送 Trace 数据
下一篇: 聊聊单体应用的 4 点不良影响,第 4 点很痛很真实
公众号-芋道源码
博客等级 码龄10年 1631粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值