第一章:分布式系统概述
大家好,我是你们这门课的老朋友。今天咱们聊聊分布式系统的那些事儿。
说实话,我入行那会儿,分布式还是个挺高大上的词儿。现在呢?你随便打开一个App,背后都是一堆机器在干活。说白了,分布式系统就是一群计算机,通过网络协作,对外表现得像一台超级计算机。
1.1 分布式系统的定义
什么叫分布式系统?我个人的理解是:一群独立的计算机,通过网络连接,协同完成共同的任务。
嗯,这里要注意几个关键点:
- 独立性:每台机器都有自己的内存和CPU,不是共享的
- 网络连接:它们靠网络通信,不是靠共享总线
- 协同工作:对外看起来像一台机器
我记得刚带团队那会儿,有个新人问我:“老师,那多台服务器跑同一个程序算分布式吗?”我说:“你想想看,如果它们之间不通信、不协作,那叫多副本,不叫分布式。”
1.2 发展历程:从单机到分布式
分布式系统不是一天建成的。我经历过几个阶段:
| 时代 | 特点 | 我踩过的坑 |
|---|---|---|
| 单机时代 | 一台机器搞定一切 | 流量一上来,机器直接冒烟 |
| 垂直拆分 | 按功能拆成不同模块 | 模块间调用越来越乱 |
| 水平扩展 | 加机器解决问题 | 数据一致性成了噩梦 |
| 微服务时代 | 每个服务独立部署 | 服务间通信、监控、治理...头大 |
我曾经在一个电商项目里,刚开始就一台服务器扛着。双十一那天,用户量暴增,服务器直接挂了。老板急得直跺脚。后来我们上了分布式,加了十几台机器,结果又遇到了数据不一致的问题——用户下单了,库存却显示还有货。嗯,这就是分布式系统要面对的核心挑战。
1.3 核心挑战:CAP理论
说到分布式系统的核心挑战,绕不开CAP理论。这个理论是Eric Brewer教授提出的,说白了就是:一致性、可用性、分区容错性,三者最多只能同时满足两个。
CAP理论三要素
- C(Consistency)一致性:所有节点看到的数据是一样的
- A(Availability)可用性:每个请求都能得到响应
- P(Partition Tolerance)分区容错性:网络出问题时系统还能工作
你可能会问:“为什么不能三者兼得?”我举个例子你就明白了。
假设你有两台服务器,分别在北京和上海。用户A在北京修改了数据,这时候北京和上海之间的网络断了。如果保证一致性,上海那边就不能响应请求,直到网络恢复——这就牺牲了可用性。如果保证可用性,上海那边继续响应,但数据可能是旧的——这就牺牲了一致性。
我个人习惯把CAP理论当作一个选择题:你的系统到底要什么?
- CP系统:牺牲可用性,保证一致性。比如银行转账系统,宁可暂时不可用,也不能账对不上
- AP系统:牺牲一致性,保证可用性。比如社交媒体的点赞数,差几个没关系,但不能点不了
- CA系统:牺牲分区容错性。但说实话,在分布式系统里,网络分区是常态,所以CA系统基本不存在
避坑指南
我曾经在一个项目中,团队非要追求“完美的一致性+完美的可用性”。结果呢?网络一抖动,整个系统就瘫痪了。后来我学乖了:先想清楚你的业务场景,再选CAP。别贪心,贪心会出事。
1.4 一致性模型
CAP理论里的一致性,其实是个很粗的概念。实际工程中,一致性有很多种模型。我给大家梳理一下:
| 一致性模型 | 描述 | 适用场景 |
|---|---|---|
| 强一致性 | 写入后,立刻能读到最新数据 | 银行、支付系统 |
| 最终一致性 | 写入后,过一段时间才能读到最新数据 | DNS、缓存系统 |
| 因果一致性 | 有因果关系的操作,顺序必须一致 | 社交网络的时间线 |
| 读己之写一致性 | 自己写的数据,自己立刻能读到 | 用户个人设置 |
你想想看,为什么会有这么多模型?因为强一致性太贵了。每次写入都要等所有节点确认,延迟高得吓人。
我记得有一次做直播弹幕系统,用户发弹幕要求实时显示。如果用强一致性,弹幕发出去要等几百毫秒才能显示,用户体验极差。后来我们用了最终一致性——弹幕先显示在发送者自己的屏幕上,其他用户稍微晚一点看到。用户根本感觉不到差异,但系统性能提升了好几倍。
注意
最终一致性不是“最终都不一致”。它保证只要时间足够长,数据最终会一致。但“足够长”是多久?这取决于你的系统设计。我曾经见过一个系统,最终一致性延迟了整整一天...那基本等于没用了。
1.5 我的经验总结
说了这么多,我给大家总结几条实战经验:
- 先想清楚业务要什么。别一上来就追求强一致性,很多时候最终一致性就够了
- 网络是不可靠的。设计系统时,默认网络会断、消息会丢、节点会挂
- 监控和可观测性很重要。分布式系统出问题时,你得像侦探一样找线索
- 不要过度设计。我见过太多团队,业务还没跑起来,先搞了一套复杂的分布式方案。结果呢?系统复杂度上去了,稳定性反而下降了
好了,第一章就到这里。分布式系统的核心挑战,说白了就是:在不可靠的网络上,构建可靠的系统。听起来矛盾,但这就是我们工程师要解决的问题。
下一章,咱们聊聊分布式系统的通信机制。到时候我会分享一些我在消息队列上踩过的坑,保证让你少走弯路。