引言
随着后端服务的发展,业务难度增加;单体的后端服务逐渐满足不了快速迭代,敏捷开发的节奏,在这样的背景下,分布式系统架构思想逐渐发展,并流行起来;在微服务思想下,将原有复杂的系统根据业务拆分成多个独立运行小系统。此时系统的复杂度就转移到怎样保证小系统之间的通信可靠性上去啦。
目前在微服务之间,常见的通信方式分为两种:
- 同步的RPC远程调用方式
- 基于中间件代理的异步方式
同步的RPC远程调用方式
如图所示,根据业务的不同划分了不同的模块,在同步调用的方式下,不同的系统之间通过直接调用通信,当调用方访问被调用方后需要等待被调用方返回的结果。因此,该方式比较好理解、实现比较简单;但当被调用方的系统宕机后,在宕机这段时间内,调用方所有的请求都会丢掉。
基于中间件代理的异步方式
如上图所示,相对于同步方式的直接调用,在异步调用中多出来一个中间件,引入了中间件,各子系统之间无需强耦合直接连接,调用方只需要将请求转化成异步事件(消息)发送给中间代理,发送成功即可认为该异步链路调用完成,剩下的工作中间代理会负责将事件可靠通知到下游的调用系统,确保任务执行完成。该中间代理一般就是消息中间件(RocketMQ中的broker)。
相较于同步方式,基于中间件异步通信的优势如下:
-
系统拓扑简单。由于调用方和被调用方统一和中间代理通信,系统是星型结构,易于维护和管理。
-
上下游耦合性弱。上下游系统之间弱耦合,结构更灵活,由中间代理负责缓冲和异步恢复。 上下游系统间可以独立升级和变更,不会互相影响。
-
容量削峰填谷。基于消息的中间代理往往具备很强的流量缓冲和整形能力,业务流量高峰到来时不会击垮下游。
结语
综上所述,介绍了服务之间的两种通信方式,第一种更多用在业务量较小的情况下,实现也比较简单;第二种主要用于应对流量冲击,流量尖峰的场景下,能有效地阻止上游服务压垮下游服务,其中RocketMQ就是采用第二种方式。
参考-RocketMQ官网