1.同步调用与异步调用的区别
同步通讯:就如同打视频电话,双方的交互都是实时的。因此同一时刻你只能跟一个人打视频电话。
异步通讯:就如同发微信聊天,双方的交互不是实时的,你不需要立刻给对方回应。因此你可以多线操作,同时跟多人聊天。
1.1.同步调用
第一,拓展性差
我们目前的业务相对简单,但是随着业务规模扩大,产品的功能也在不断完善。
在大多数电商业务中,用户支付成功后都会以短信或者其它方式通知用户,告知支付成功。假如后期产品经理提出这样新的需求,你怎么办?是不是要在上述业务中再加入通知用户的业务?
某些电商项目中,还会有积分或金币的概念。假如产品经理提出需求,用户支付成功后,给用户以积分奖励或者返还金币,你怎么办?是不是要在上述业务中再加入积分业务、返还金币业务?
。。。
最终你的支付业务会越来越臃肿
第二,性能下降
由于我们采用了同步调用,调用者需要等待服务提供者执行完返回结果后,才能继续向下执行,也就是说每次远程调用,调用者都是阻塞等待状态。最终整个业务的响应时长就是每次远程调用的执行时长之和
第三,级联失败
由于我们是基于OpenFeign调用交易服务、通知服务。当交易服务、通知服务出现故障时,整个事务都会回滚,交易失败。
这其实就是同步调用的级联失败问题。
1.2.异步调用
异步调用方式其实就是基于消息通知的方式,一般包含三个角色:
消息发送者:投递消息的人,就是原来的调用方
消息Broker:管理、暂存、转发消息,你可以把它理解成微信服务器
在异步调用中,发送者不再直接同步调用接收者的业务接口,而是发送一条消息投递给消息Broker。然后接收者根据自己的需求从消息Broker那里订阅消息。每当发送方发送消息后,接受者都能获取消息并处理。
这样,发送消息的人和接收消息的人就完全解耦了。
消息接收者:接收和处理消息的人,就是原来的服务提供方
综上,异步调用的优势包括:
耦合度更低
性能更好
业务拓展性强
完全依赖于Broker的可靠性、安全性和性能
架构复杂,后期维护和调试麻烦
故障隔离,避免级联失败
2. MQ选型
2.1 MQ基本概念
2.2 rabbitMQ的消息收发注意事项
2.3 数据隔离
对用户进行管理
2.4 JAVA中使用rabbitMQ
发送信息
接收信息
2.5 WorkQueues模型
Work queues,任务模型。简单来说就是让多个消费者绑定到一个队列,共同消费队列中的消息。
消息发送者(使用for循环)
消费者
work模型的特点(使用prefetch来展示能者多劳)
2.6 使用交换机进行调用
fanout交换机(广播模式)
在广播模式下,消息发送流程是这样的:
-
1) 可以有多个队列
-
2) 每个队列都要绑定到Exchange(交换机)
-
3) 生产者发送的消息,只能发送到交换机
-
4) 交换机把消息发送给绑定过的所有队列
-
5) 订阅队列的消费者都能拿到消息
在发送消息部分:
在消费者部分
direct交换机(选择模式)
消息发送者
消费者
根据不同的routekey调用不同的队列
总结
topic交换机(使用通配符模式)
消息发送
消费者
总结
2.7 基于代码进行声明队列与交换机
在消费者中创建一个config
2.8基于注解进行声明队列与交换机
在消息发送端写注解
2.9 消息转换器
导入依赖
<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> <version>2.9.10</version> </dependency>