当一个软件系统发展为微服务架构风格的分布式系统时,限界上下文之间的协作就可能会从进程内通信变为跨进程通信。利用防腐层,固然可以减少因为通信方式的变化对协作机制带来的影响;然而,若是全然无视这种变化,又未免有些掩耳盗铃了。无论采用何种编程模式与框架来封装分布式通信,都只能做到让跨进程的通信方式变得更加透明,却不可抹去分布式通信固有的不可靠性、传输延迟性等诸多问题,选择的 I/O 模型也会影响到计算机资源特别是 CPU、进程和线程资源的使用,从而影响服务端的响应能力。分布式通信传输的数据也有别于进程内通信,选择不同的序列化框架、不同的通信机制,对远程服务接口的定义也提出了不同的要求。
分布式通信的设计因素
一旦决定采用分布式通信,通常需要考虑如下三个因素:
- 通信协议:用于数据或对象的传输
- 数据协议:为满足不同节点之间的统一通信,需确定统一的数据协议
- 接口定义:接口要满足一致性与稳定性,它的定义受到通信框架的影响
通信协议
为了保障分布式通信的可靠性,在传输层需要采用 TCP 协议,它能够可靠地把数据在不同的地址空间上搬运。在传输层之上的应用层,往往选择 HTTP 协议,如 REST 架构风格的框架,又或者采用二进制协议的 HTTP/2,如 Google 的 RPC 框架 gRPC。
可靠传输还要建立在网络传输的低延迟基础上,如果服务端如果无法在更短时间内处理完请求,又或者处理并发请求的能力较弱,就会导致服务器资源被阻塞,影响数据的传输。数据传输的能力取决于操作系统的 I/O 模型,因为分布式节