刚接触分布式应用程序的程序员总是做出的错误假设。
出现关于分布式系统的错误认知
网络可靠
网络不可靠,任何特定通信都可能失败
- 解决方案:
- 重传
- 存储重传(可在宕机后恢复传送)
无延迟
延迟无处不在, 与 光速和通信距离(或路径)有关
所有:两个系统之间的距离在这里起着重要作用。
- 减少延迟的影响
- 要缩短系统通讯的物理距离
- 每次请求尽可能传输更多数据。
带宽无限
通讯通道能承载的数据大小是有限的
虽然为了降低延迟的影响要尽可能多传输数据,但如果数据量达到了带宽限制,会很快崩溃
权衡 延迟与带宽, Trade off
无通讯成本
系统增多,通讯增多,过去可忽略的系统间的通信成本变高。
比如:过去的系统基本都用xml,json传输。但在大规模的分布式系统中用json格式通讯已经变的有些重量级,
目前更多会使用grpc等通讯方式
网络安全
各种层面的漏洞层出不穷。
随着众包漏洞赏金计划的出现和每天新闻中的重大漏洞利用,这一点变得更加明显。
拓扑不变
随着 Docker 和 Kubernetes 的出现, 网络结构会很容易发生变化
暴露的问题是:如果基础设施的关键部分出现故障,流量能否继续流向适当的目的地?是否存在单点故障?
网络是同构的
分布式系统非常灵活
不同的操作系统、不同的框架、不同的数据格式 都可能存在系统里
所以实现互通必不可少
只要管理一个系统
系统会不可避免的依赖你无法控制的其他系统。 需要管理的系统会很多
所以需要考虑系统依赖关系, 管理各自系统的配置,监控、观察跨系统的调用
- 基础架构即代码 (IaC)