资讯动态

分布式系统扩展:从水平扩展到一致性哈希的核心架构策略

发布时间:2026/9/2 2:54:35 来源:尧图企业网站定制
大家好我是在整理“软件架构与设计”系列笔记时发现很多同学对分布式系统的理解容易停留在“多节点部署”这个层面一旦问到“怎么扩展”“扩展后如何保持数据一致”“如何平衡性能和成本”就缺少一套系统的思路。这一部分正好对应课程中的 P2Cristian内容扩展分布式系统。本文将围绕这一主题从概念拆解到架构策略再到一个完整的设计案例尽量把扩展的底层逻辑讲清楚。本文适合正在学习软件架构、分布式系统基础或者打算把项目从单体改造成分布式架构的开发者。读完后你会掌握扩展的核心维度、常用扩展模式、数据层扩展方法以及在实际项目中做扩展设计时需要考虑的工程问题。1. 为什么分布式系统需要“扩展”1.1 从单体到分布式先从一个常见场景说起。早期业务量不大时一个应用服务器、一个数据库、一台文件服务器基本能撑住所有请求。这种单体架构的好处是简单代码集中、部署方便、调试直接。但业务发展到一定阶段后单体架构会逐渐吃力用户量增长请求并发变高单台服务器的 CPU、内存、网络带宽成为瓶颈。数据量增长单台数据库的存储容量和处理能力达到上限。功能模块越来越多团队多人协作时代码编译、部署、回归成本不断上升。某个模块出现性能问题往往会拖垮整个应用。这时就需要引入分布式系统把计算、存储、通信分散到多台机器上。可分布式并不是简单“机器变多”它带来了新的复杂度节点间如何通信、数据如何同步、某个节点挂了怎么办、如何扩展才能不中断服务。扩展分布式系统正是为了解决这种复杂度下“系统容量和性能是否能平滑增长”的问题。1.2 扩展、伸缩与可扩展性在中文技术语境中“扩展”可能会对应几个英文词英文中文翻译含义Scale伸缩/扩展增加或减少系统资源以匹配负载变化Scalability可伸缩性系统在规模变化时维持性能的能力Extensibility可扩展性系统通过添加新功能、新模块而不用大改的能力在 P2 课程里提到“扩展分布式系统”时重点通常放在Scalability和Scale上即系统的承载能力如何随着资源增加而提升。但我们不能忽略 Extensibility因为分布式系统本身模块多架构如果不能扩展功能后续再加新业务也会很痛苦。1.3 为什么“扩展”是架构设计核心议题软件架构设计中最核心的诉求之一是“应对变化”而变化最典型的表现就是流量和数据规模的上升。一个设计良好的分布式系统应当具备以下特征增加节点后吞吐量能近似线性提升。单个节点故障不会导致整体不可用。数据量和请求量增长时系统能通过自动化手段横向扩展。扩展操作对调用方透明不需要修改客户端代码。这些特征很难一次性达到需要从架构层面统筹考虑。下面我们进入核心内容拆解扩展分布式系统需要关注的所有关键点。2. 分布式系统扩展的核心要素2.1 扩展的两个方向垂直扩展与水平扩展垂直扩展Scale Up垂直扩展是指提升单台机器的硬件配置比如增加 CPU 核数、内存大小、磁盘容量、网络带宽。这种方式的优点是改造成本低不需要调整代码只需要换机器或升级配置。缺点也很明显硬件性能有物理上限不可能无限提升。昂贵高规格服务器价格远高于普通服务器。单点风险大机器一旦故障系统就不可用。停机扩展时往往需要重启影响线上服务。水平扩展Scale Out水平扩展是指增加更多机器组成集群共同提供服务。水平扩展是分布式系统最常用、也最推荐的扩展方式。优点是理论上可以无限扩展受成本限制而非物理限制。单点故障影响面小集群中部分节点故障不影响整体。可以使用普通机器成本控制更灵活。水平扩展的难点在于需要让请求能均匀分布到多台机器上需要处理节点间数据同步需要保证任意一个节点都能提供一致或最终一致的数据视图。因此水平扩展并不是“加机器”这么简单它需要架构设计上的配合。2.2 可扩展性的关键指标在设计扩展方案前我们需要知道如何评价扩展效果。通常关注以下指标吞吐量Throughput单位时间内系统处理的请求数比如 QPS、TPS。响应时间Latency从请求发出到收到响应的时间通常看平均值、P99、P999。扩展比Scale Ratio资源增加 n 倍后吞吐量提升的比例。理想情况下扩展比接近 n但由于通信开销、锁竞争等因素通常小于 n。可用性Availability系统在故障情况下仍能提供服务的概率。资源利用率UtilizationCPU、内存、磁盘、网络的使用情况是否有空闲资源是否有热点。需要说明的是扩展不是无限往一个点堆资源。当系统扩展到一定程度瓶颈会从一个节点转移到另外一个节点比如应用层可以扩展了数据库成为瓶颈数据库做了读写分离网络带宽又成为瓶颈。所以扩展是一个持续发现瓶颈、突破瓶颈的过程。2.3 扩展的瓶颈与挑战在分布式系统扩展过程中常见的瓶颈包括状态存储如果业务数据都在内存或本地磁盘不能共享那么水平扩展后请求路由不到正确的节点数据就不一致。计算热点某些 key 被大量访问例如微博热搜、秒杀商品请求集中在一两个节点其他节点却很空闲。协调开销节点之间需要互相通信来达成一致节点越多协调成本越高。可靠性下降大量节点中每一台都可能有故障如何自动检测、摘除、恢复节点是必须解决的问题。运维复杂度配置管理、监控、日志收集、版本升级都会随节点数量变多而变复杂。看见这些问题我们才能明白为什么架构设计要提前考虑扩展而不是等性能告警了再临时加机器。3. 扩展策略与架构模式3.1 副本与负载均衡水平扩展最常见的第一步是“多副本 负载均衡”。架构很简单同一个服务部署多个实例前端通过负载均衡器按一定策略把请求分发到不同实例。负载均衡策略包括轮询Round Robin请求轮流分发到各节点适合无状态服务。加权轮询Weighted Round Robin根据节点性能配置权重性能好的节点多分一些请求。最小连接数Least Connections优先分给当前连接数最少的节点。IP Hash / 一致性哈希根据请求来源或业务 key 哈希取模使同一请求源或同一业务始终访问同一节点适合有状态场景。使用副本模式时必须保证服务尽量无状态。即不要在节点内存中保存用户会话、临时数据等关键业务状态。如果确实需要状态可以把状态外置到 Redis 或数据库这样节点可以随时增减。3.2 分区与分片当数据量超过单机存储上限时我们需要把数据分区存储。分区Partition也叫分片Shard核心思想是将整个数据集按某个维度拆分成多个子集每个子集交给不同节点管理。常见的分区维度有范围分区按照某个字段值的区间划分比如按用户 ID 范围分成 1-1000、1001-2000。哈希分区对某个字段做哈希取模后映射到不同分片。列表分区按枚举值分区比如按省份、按业务类型。一致性哈希分区将哈希值空间组织成环按哈希值映射到节点适合节点动态变化场景。分区能解决数据存储容量问题但引入的一个核心问题是跨分区查询、跨分区事务变得困难。因此在设计分区键时要尽量让大多数请求只访问一个分区避免大量跨分区操作。3.3 缓存缓存是分布式系统扩展中投入产出比很高的手段。引入缓存后大量读请求可以直接命中缓存减轻数据库和计算节点的压力。常见的缓存层次本地缓存如 Caffeine、Guava Cache放在应用进程内访问快但每个节点缓存一致性问题需要处理。分布式缓存如 Redis、Memcached多个应用节点共享同一份缓存数据适合读多写少的场景。CDN 缓存对于静态资源通过 CDN 分发到边缘节点减少源站压力。缓存设计的关键点是明确缓存什么、缓存多久、缓存如何更新。缓存只是“加速层”不能把它当成数据持久化存储否则一旦缓存丢失数据就找不回来了。3.4 异步与消息队列扩展的另一个有效策略是“削峰填谷”这需要借助消息队列Message Queue。当请求激增时不要求后台处理系统立即完成全部计算而是先把请求以消息形式写入队列后台消费者按照自己的处理能力消费消息。消息队列带来两个好处解耦生产者和消费者不直接依赖可以各自独立扩展。比如消费者处理慢了就增加消费者实例。缓冲瞬时高峰流量被队列吸收避免数据库或核心服务被冲垮。常见的消息队列有 Kafka、RocketMQ、RabbitMQ 等。引入消息队列后必须考虑消息的可靠投递、重复消费、顺序性等问题。很多系统“扩展”得很好但数据最终对不上账往往是消息消费这块没做好。3.5 微服务与无状态设计微服务架构本质上是一种便于扩展的架构风格。把系统拆分为多个小而独立的服务后可以对流量较大的服务单独扩展而不必扩容整个系统。比如订单服务需要 20 个节点而用户服务只需 5 个节点微服务架构可以很自然地做到这点。但微服务也带来新的挑战服务发现、配置管理、链路追踪、分布式事务。如果项目本身很小强行拆微服务反而会增加复杂度。是否使用微服务要看业务规模和团队能力不要为了“扩展”而盲目微服务化。4. 一致性哈希扩展中最常用的设计4.1 为什么需要一致性哈希在分布式缓存或路由场景中最简单的数据分布方式是取模哈希。例如有 3 个节点按key % 3决定数据落在哪个节点。这个方案在节点数不变时简单有效一旦增加或删除节点取模的基数变了绝大多数 key 会映射到新的节点导致大量缓存失效所有请求穿透到数据库。一致性哈希就是为了解决这个问题。它的核心思想是把哈希值空间组织成一个环节点和数据都哈希到环上数据顺时针找到最近的节点。当节点增加或删除时只有很少一部分 key 需要迁移。4.2 一致性哈希原理与示例我们来看一个简化版示意图哈希环0 ------------------- 2^32-1 节点A 哈希到 100 节点B 哈希到 500 节点C 哈希到 800 数据key1 哈希到 150顺时针找到 500所以存到节点B 数据key2 哈希到 600顺时针找到 800所以存到节点C 数据key3 哈希到 900顺时针找到 100所以存到节点A当节点 B 被移除后原本映射到 B 的 key1 会顺时针找到 C因此只有节点 B 上的一部分数据迁移到 C其他节点的数据不受影响。这正是一致性哈希最大的优点。如果要用代码表达简单的哈希环映射逻辑可以用下面的 Java 伪代码import java.util.SortedMap; import java.util.TreeMap; public class ConsistentHash { private final SortedMapInteger, String circle new TreeMap(); private final int numberOfReplicas; public ConsistentHash(int numberOfReplicas, ListString nodes) { this.numberOfReplicas numberOfReplicas; for (String node : nodes) { addNode(node); } } public void addNode(String node) { for (int i 0; i numberOfReplicas; i) { int hash hash(node # i); circle.put(hash, node); } } public void removeNode(String node) { for (int i 0; i numberOfReplicas; i) { int hash hash(node # i); circle.remove(hash); } } public String getNode(String key) { if (circle.isEmpty()) { return null; } int hash hash(key); SortedMapInteger, String tailMap circle.tailMap(hash); Integer targetHash tailMap.isEmpty() ? circle.firstKey() : tailMap.firstKey(); return circle.get(targetHash); } private int hash(String key) { // 实际开发可选用更均匀的哈希算法例如 MD5 后取 32 位 int return key.hashCode() 0x7fffffff; } }这里用TreeMap模拟哈希环tailMap用于查找顺时针方向最近的节点。需要注意的是String.hashCode()分布不够均匀生产环境推荐使用MD5、MurmurHash等更均匀的哈希算法。4.3 虚拟节点一致性哈希在节点数量较少时可能出现哈希分布不均匀的问题。比如只有 3 个节点它们在环上的位置可能很近导致大量数据落在同一个节点上。解决办法是引入虚拟节点。虚拟节点的做法是每个真实节点在环上对应多个虚拟位置。比如节点 A 有 A#0、A#1、A#2、A#3 等多个虚拟节点数据映射到任意一个虚拟节点最终都代表写入真实节点 A。这样哈希分布会更均匀同时节点增减时涉及的数据迁移也更平滑。虚拟节点的数量需要权衡。数量太少均匀性不够数量太多内存占用和查找开销会增加。一般推荐每个真实节点分配 100200 个虚拟节点具体需要根据集群规模测试调整。4.4 改进方向与注意事项一致性哈希虽然解决了数据迁移范围的问题但也存在一些注意点倾斜问题即使使用一致性哈希仍然可能因热点 key 导致某个节点压力过大。可以结合热点数据多副本或者单独做热点 key 缓存。数据存储与路由的耦合一致性哈希适合无状态路由但如果是数据库分片需要避免扩容时全量数据重分布可以采用“预分片”或“双写迁移”方案。增删节点的顺序在扩容时新节点通常先以“只读”或“不接收流量”的方式加入等数据同步完成后再切换流量。哈希算法稳定性不同语言、不同类库对同一 key 计算出的哈希可能不同多语言环境需要统一哈希算法。5. 从数据层看扩展分区、复制与分库分表5.1 数据库扩展思路分布式系统中数据层往往是最难扩展的部分。应用层可以快速加节点但如果数据库还是单机那么数据库很快就会成为瓶颈。数据层的扩展通常分几步走读写分离一主多从主库负责写从库负责读。垂直拆分按业务模块拆分数据库比如用户库、订单库、商品库。水平分片单个表数据量过大时把表的数据按某个键拆到多个库/表。每一步都会带来新的复杂度需要结合业务发展阶段决定是否引入。5.2 读写分离读写分离是最常用的数据库扩展方式。主库接收增删改操作从库通过主从复制同步数据只接收读操作。应用层通过连接池或中间件把读写请求路由到不同数据源。优点读能力可以随从库数量扩展。主库不需要承担大量读负载更稳定。潜在问题主从复制有延迟刚写入的数据可能读不到。从库增多后主库需要把 binlog 同步给多个从库网络和磁盘 IO 会增大。某个从库故障后读流量需要切换到其他从库或主库。应对复制延迟的常见做法是对实时性要求很高的读请求强制走主库或者使用“半同步复制”来保证某条关键数据至少在一个从库落盘。5.3 垂直拆分与水平分片垂直拆分是按业务模块把表拆到不同数据库比如用户库、订单库、商品库。垂直拆分后数据库之间不能做跨库 JOIN需要通过应用层组装或冗余字段来解决。它适合业务模块边界清晰的系统。水平分片则是把同一张表的数据按分片键拆到多个数据库实例。例如订单表有 1 亿条数据按用户 ID 哈希分成 16 个库每个库只存一部分数据。水平分片能从根本上解决单表数据量大、单库容量不够的问题。水平分片的关键是选择分片键必须保证绝大多数请求携带分片键。分片键应具备良好的离散性避免数据集中在少数分片。应尽量避免跨分片查询和跨分片事务。如果业务查询既需要按用户维度又需要按订单号维度单一分片键不能满足所有需求就需要引入“全局表”“冗余表”或“数据同步”方案复杂度会明显上升。5.4 分布式事务的取舍当数据分散到多个数据库后多个数据源之间的数据一致性成为难题。传统单库事务不再适用常见的方案有两阶段提交2PC强一致但协调成本高性能差不适合高并发场景。事务消息通过消息队列实现最终一致性适合异步场景。本地消息表在业务数据库中记录消息结合定时任务投递最终一致。TCC / Saga通过补偿操作保证最终一致性适合长事务场景。设计分布式系统时要清醒地认识到分布式环境下没有“银弹”强一致通常会牺牲可用性和性能。很多场景下最终一致性已经足够满足业务需求。开发者的职责是明确业务对一致性的真实要求然后选择合适的方案。6. 一个完整的案例设计支持扩展的短链服务为了把这些概念串起来我们设计一个经典的短链服务Short URL Service。这个案例足够小能说明分布式扩展的核心步骤。6.1 需求与扩展目标业务需求用户提交一个长 URL系统返回一个短码。用户访问短链时系统重定向到原始长 URL。需要统计短链的创建量、访问量。扩展目标读 QPS 可以随时通过添加应用实例扩展。短码数据量上亿后数据库不成为瓶颈。访问量暴增时不会把后端打垮。6.2 系统架构短链服务可以简化为以下组件应用服务层无状态服务提供生成短码、查询长 URL 的接口。缓存层Redis 缓存短码到长 URL 的映射加速读请求。存储层MySQL 或其他关系型数据库持久化短码和长 URL。消息队列可选异步记录访问日志避免写入压力。架构流程创建短链应用服务收到长 URL 后生成唯一短码写入数据库并更新 Redis 缓存。访问短链应用服务先查 Redis缓存未命中则查数据库再回填 Redis。数据落地每次访问信息可发送到消息队列由消费者异步统计。6.3 关键代码实现下面使用 Java Redis MySQL 展示核心逻辑。重点是保持应用层无状态支持水平扩展。// 文件路径src/main/java/com/example/shorturl/ShortUrlService.java Service public class ShortUrlService { Autowired private StringRedisTemplate redisTemplate; Autowired private ShortUrlRepository repository; private static final String CACHE_KEY_PREFIX short_url:; public String createShortUrl(String longUrl) { String shortCode generateShortCode(longUrl); ShortUrlEntity entity new ShortUrlEntity(); entity.setShortCode(shortCode); entity.setLongUrl(longUrl); repository.save(entity); redisTemplate.opsForValue().set(CACHE_KEY_PREFIX shortCode, longUrl); return shortCode; } public String getLongUrl(String shortCode) { String cacheKey CACHE_KEY_PREFIX shortCode; String longUrl redisTemplate.opsForValue().get(cacheKey); if (longUrl ! null) { return longUrl; } ShortUrlEntity entity repository.findByShortCode(shortCode); if (entity null) { return null; } // 回填缓存设置过期时间避免冷数据一直占用内存 redisTemplate.opsForValue().set(cacheKey, entity.getLongUrl(), 24, TimeUnit.HOURS); return entity.getLongUrl(); } private String generateShortCode(String longUrl) { // 可以使用 HASH 后截取也可以使用全局发号器。 // 注意需要保证短码唯一并处理碰撞。 String hash DigestUtils.md5DigestAsHex(longUrl.getBytes()); return hash.substring(0, 8); } }这里省略了数据库表结构和ShortUrlEntity实际开发中需要为short_code建立唯一索引防止并发生成重复短码。如果使用截取 MD5 的方式理论上有碰撞概率更严谨的做法是使用雪花算法生成 ID再将 ID 编码为短码。6.4 扩展方式分析这个短链服务可以如何扩展应用服务层服务本身不保存会话状态只需要在负载均衡后部署多个实例即可水平扩展读 QPS。缓存层Redis 可以部署为集群通过一致性哈希分散缓存数据减少单节点压力。数据层当短码数量过亿单库单表不够时可以按短码哈希进行分库分表。因为访问短链时总以短码作为查询条件分片键非常明确适合水平拆分。写入操作创建短链的写请求相对较少可以通过消息队列削峰保证数据库平稳。当某个短码访问量特别高时Redis 缓存会承担几乎所有读请求。如果缓存节点不够可以给热点短码增加多级缓存或者单独设置永久缓存。这就是“热点 key 治理”问题。7. 扩展分布式系统的常见问题与排查思路7.1 缓存穿透、击穿、雪崩缓存是扩展中常用的组件但使用不当也会引发连锁问题。缓存穿透查询一个必然不存在的 key每次都会打到数据库。缓存击穿某个热点 key 的缓存刚好过期大量请求同时打到数据库。缓存雪崩大量 key 在同一时间过期或者缓存节点故障导致数据库压力骤增。问题可能原因解决思路缓存穿透查询不存在数据布隆过滤器拦截缓存空值并设置短过期时间缓存击穿热点 key 过期互斥锁重建缓存热点 key 不设置过期时间由后台更新缓存雪崩大量 key 同时过期 / 节点故障过期时间加随机值多级缓存缓存集群高可用排查时先看监控指标缓存命中率、数据库 QPS、Redis 节点 CPU。如果数据库 QPS 明显高于缓存命中率对应的 QPS就要怀疑是否存在大量 cache miss。7.2 数据不一致扩展后数据往往存在多份副本主从复制、缓存、消息队列都可能造成数据不一致。常见场景先更新数据库再删除缓存如果缓存删除失败缓存中就是旧数据。先更新缓存再更新数据库如果数据库更新失败缓存和数据库不一致。主从复制延迟业务读到旧数据。解决思路优先保证数据库正确缓存最终失效。缓存更新操作加入重试机制或者使用 binlog 订阅异步更新缓存。对一致性要求极高的场景考虑强一致方案但要评估性能代价。7.3 扩容时流量倾斜水平扩容后如果负载均衡策略不合理或者数据分片不均匀可能出现部分节点负载很高部分节点闲置。流量倾斜会导致扩容效果不明显甚至局部故障。排查方法查看每个节点的 QPS、CPU、内存指标确认是否有明显热点。分析请求 key 的分布看是否存在热点 key。如果使用一致性哈希检查虚拟节点数量和哈希算法是否合适。如果使用数据库分片检查分片键的离散度。解决方案针对热点 key 做二级缓存或本地缓存。动态调整负载均衡权重。对数据分片做再平衡但要注意迁移过程中的双写和校验。7.4 如何做好容量评估扩容前需要回答几个问题当前系统峰值 QPS 是多少单节点能支撑多少 QPS需要多少个节点才能扛住预计峰值瓶颈是在 CPU、内存、磁盘还是网络容量评估不能凭感觉可以用压测工具如 JMeter、wrk、k6对单节点做基准测试得到单节点性能基线然后计算节点数。同时要预留 30%50% 的余量避免突发流量。扩容后还要持续观察指标确认瓶颈是否真的转移到下一层。8. 最佳实践与工程建议8.1 设计先行提前规划可扩展点不要在系统快要崩溃时再考虑扩展应在架构设计阶段预留扩展空间。比如应用层设计为无状态所有状态外置。数据表设计时预留分片键字段。模块间通过接口通信避免强依赖具体实现。配置项尽量外部化支持动态修改。8.2 配置与灰度发布扩展往往伴随节点变更节点配置管理要避免手动修改。推荐使用配置中心统一管理比如 Nacos、Apollo、Consul。新节点上线时可以通过灰度发布逐步切换流量先观察一小部分请求确认稳定后再全量放开。在分布式系统中节点扩缩容操作要纳入变更流程管理。每一次变更都应该有回滚方案。比如新节点加入后数据不一致能否快速摘除节点缓存配置调整后出现异常能否一键回滚配置8.3 可观测性扩展一个“看不到内部状态”的分布式系统是很危险的。必须建立完善的监控体系指标监控QPS、响应时间、错误率、资源使用率。日志采集统一日志格式集中存储便于查询。链路追踪使用 SkyWalking、Zipkin 或 OpenTelemetry 等工具追踪请求在多个服务间的完整路径。告警设置合理的告警阈值出现异常时及时通知。只有把可观测性做好才能在上线扩展变更时快速定位问题否则“系统慢了”都没法判断是哪个节点造成的。8.4 故障演练与容量压测扩展能力需要在真实或近似真实的环境下验证。定期进行故障演练比如随机杀掉一个节点观察系统是否自动摘除它模拟缓存节点故障观察数据库是否能扛住流量压测到预期峰值的 1.5 倍验证系统是否稳定。故障演练不是为了证明系统没问题而是提前发现架构中的弱点。尤其是自动扩缩容机制一定要经过演练避免在真实故障时因脚本问题导致更大的故障。8.5 演进式架构避免过度设计最后要说的是扩展设计要结合业务现状不要一上来就引入微服务、分库分表、消息队列。过度设计会给团队带来巨大的开发和运维成本。推荐的演进路径是单体架构 读写分离满足初期性能需求。应用层水平扩展引入缓存进一步提升读性能。数据量增长后先做垂直拆分。单表数据量极大时再做水平分片。业务模块边界清晰且团队规模变大后再拆分微服务。每次演进前都要确认当前系统的瓶颈确实在哪并且有足够的数据支持这个判断。架构演进应该是一个受控的过程而不是拍脑袋的决定。9. 总结与学习路线这一篇围绕“扩展分布式系统”整理了从概念到实践的内容。核心可以概括为以下几点扩展分垂直扩展和水平扩展分布式系统更关注水平扩展。扩展的真正难点不是加机器而是如何解决状态、数据、流量分布、一致性和运维复杂度。无状态设计、负载均衡、缓存、消息队列、数据分区、一致性哈希都是扩展分布式系统的重要工具。数据层扩展是最高优先级也是最高风险点读写分离、垂直拆分、水平分片要按顺序演进。扩展过程中必须配合可观测性、容量评估、故障演练和回滚机制保证变更可控。如果把分布式系统比作一个车队那么扩展就是“如何让车队在跑得快的同时不掉队、不翻车”。单靠增加车辆解决不了驾驶配合问题只有统一调度、合理分配负载、提前规划路线整个车队才能平稳提速。接下来可以继续学习的方向分布式一致性算法Paxos、Raft、ZAB。分布式缓存与 Redis 集群架构。消息队列中的可靠性投递与顺序性。分库分表中间件原理。云原生下的自动弹性伸缩Kubernetes HPA 等。如果你正在设计或维护一个分布式系统建议先从“状态管理”和“数据访问路径”入手分析把这两块理清楚再去选框架和方案扩展会顺利很多。希望这篇文章对你的学习和项目实践有帮助。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价