讲到异步通信,不得不先提同步通信,如果把打电话比做同步,那短信就是异步。同步操作有个优点,实时性好,但存在以下问题。
1 影响吞吐量,系统间同步通信,吞吐量由最慢的那个系统决定。
2 浪费系统资源,同步通信是阻塞的,导致调用方一直占用着系统资源。
3 只能一对一
4 系统之间强依赖,容易出现连锁反应
异步通信可以很好的解决以上问题。常见的异步通信模型有三种,请求响应,发布订阅,通过消息队列
1 请求响应,这个模型常见的有两种方式,前面的处理一样,接受方接到数据后立即回复已收到,正在处理,区别在于,一种是调用方轮询结果,另一种接收方回调。很多支付页面就是通过回调的方式,支付成功后回调接口,通知调用方。请求响应模型实际上两者还是耦合在一起。调用方依赖于接收方。
2 发布订阅模型,订阅者将自己注册到,发布者的订阅列表中,当发布者有消息发布是,向列表中的所有成员发送消息。因为订阅者需要向发布者注册,所以他们之间还是有耦合关系,订阅者依赖于发布者。
3 通过消息队列,生产者发送消息到队列上,消费者监听队列,获取数据。这个模型双方是完全解耦。生产者只管生产数据,不用关心谁处理。而消费者也不关心谁生产的数据,只管消费数据。
以上是异步通信常见的三个模型。其中二三两用称之为事件驱动模型。他又以下好处
1 服务之间完全解耦,使得服务之间平等,无状态,容易横向扩展实现高可用。
2 服务的开发,测试,运维都是高度隔离的,可以对某个服务进行升级而不影响到其他服务。
3 不会出现连锁反应
4 容易增加一些适配器,如日志,限流,熔断等
5 使得每个服务可以按照自己的处理速度进行处理。
事件驱动模型也有缺点
1 业务流程变复杂
2 事件事件顺序无法保证
3 分布式事务问题,要引入两段式事务,或者最终一致性。
异步设计的要点
为什么要使用异步通信
1 服务间解耦,做到更好的隔离性,以便故障出现时,不会干扰到其他服务。
2 增加吞吐量
3 服务之间可以按照自己的处理速度工作,通过消息队列,可以做到所谓的削峰的目的,保护系统。
4 独立部署,不影响其他服务,提高开发和运维的效率。
设计要点
1 消息队列的高可用
2 业务流程的可追踪
3 业务状态由总控方控制。
4 发送确认机制,失败重试机制,注意消息处理的幂等性。
网友评论