欢迎来到“雪碧聊技术”CSDN博客!
在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将不断探索Java的深邃世界,分享最新的技术动态、实战经验以及项目心得。
让我们一同在Java的广阔天地中遨游,携手提升技术能力,共创美好未来!感谢您的关注与支持,期待在“雪碧聊技术”与您共同成长!
目录
一、同步调用(一个一个来,串联的)
1、举例:余额支付
2、优点
3、缺点
①拓展性差
②性能下降
③级联失败
4、总结
二、异步调用
1、异步调用的三个角色
①消息发送者:投递消息的人,就是原来的调用方。
②消息代理:管理、暂存、转发消息,你可以把它理解成微信服务器。
③消息接收者:接收和处理消息的人,就是原来的服务提供方。
举例:
类比:
2、优点
①解除耦合,拓展性强
②无需等待,性能好
③故障隔离
④缓存消息,流量削峰填谷
3、总结
4、什么场景下,适合选用异步调用?
三、MQ技术选型
1、什么是MQ?
2、选用什么类型的MQ?
一、同步调用(一个一个来,串联的)
1、举例:余额支付
2、优点
时效性强,前面的模块会一直等到后面的模块返回结果。
3、缺点
①拓展性差
举例:存在业务耦合的问题,即:一开始支付服务模块调用了用户服务、交易服务两个模块,后期产品经理说需要加上通知服务、积分服务,此时我们就需要改代码。
②性能下降
举例:假设每个模块耗时50毫秒,那么调用支付服务模块的耗时高达几百毫秒(因为支付服务调用了后面的几个模块),此时用户体验太差,性能下降。
③级联失败
举例:假设交易服务模块出现故障,那么下面的一系列业务都会出问题,就好比一个电路,一个点发生断路,整个路都将断开。
4、总结
二、异步调用
1、异步调用的三个角色
异步调用方式其实就是基于消息通知的方式,一般包含三个角色。
①消息发送者:投递消息的人,就是原来的调用方。
②消息代理:管理、暂存、转发消息,你可以把它理解成微信服务器。
③消息接收者:接收和处理消息的人,就是原来的服务提供方。
举例:
原来支付服务模块要调用交易服务来更新订单状态,现在学了异步调用,就不再调用交易服务了,而是发一条消息给消息代理,然后就什么都不管了,然后消息接受者监听到了消息,处理并返回结果给消息代理即可。
类比:
之前外卖员会把外卖送到你手里,假设你正在上课,那么外卖员就必须一直在门口等着,等到你下课然后把外卖送到你手里。
后来有了外卖柜(相当于消息代理),外卖员只需要把外卖放到外卖柜子里,然后就直接走了, 然后你找时间去外卖柜拿外卖就行了,此时外卖员和消费者没有关系,是解耦的,自己干自己的就行,都找这个外卖柜(消息代理)就行了。
2、优点
①解除耦合,拓展性强
支付服务模块只需将支付消息发送给消息代理即可,后面添加什么业务模块,都和支付服务模块没关系,而是让消息代理监听一下就好。因为所有模块之间都不见面,而是都去找消息代理(外卖柜)。
②无需等待,性能好
支付服务模块只需要将支付消息放到消息代理即可,然后就可以离开。
③故障隔离
后面模块发生异常,和支付服务模块没关系,因为二者都不见面,而是以消息代理为中心。
④缓存消息,流量削峰填谷
某一个时间段(比如双11)来了海量的支付消息,如果不采用异步调用,那么这些海量的支付消息就会直接打到交易服务、通知服务、积分服务上,可能导致模块崩溃,而平时可能支付消息就很少,就导致了消息流量是波形的,一会高一会低。
而采用了异步调用,这些海量的支付消息就会被存入消息代理(消息代理容量巨大),然后后面自己再一点一点处理,此时消息流量就是平稳的。就好比村子里来洪水了,但是有一个巨大无比的缸,正好可以存住这些洪水,然后自己后期再一瓢一瓢清理掉就好了。
3、总结
注意:broker,就是“消息代理”的意思。
4、什么场景下,适合选用异步调用?
①你对于对方的执行结果不关心,即成功/失败都对于我们的业务没有太大影响。比如:订单的状态更新(状态更不更新无所谓,钱到手里才是关键)
②查询业务就不能使用异步调用,因为查询结果是必须的,得不到无法开展后续业务。因此查询业务必须使用同步调用。
③调用链超长,调用时间特别慢的时候,应该改为异步调用。
三、MQ技术选型
1、什么是MQ?
MQ(MessageQueue):中文意思就是消息队列,字面来看就是存放消息的队列,也就是异步调用中的Broker(消息代理)。
举例:
2、选用什么类型的MQ?
如果要追求可靠性,那就选择RabbitMQ;如果要选择吞吐量,那就选择Kafka。
我们本次学习的就是RabbitMQ,因为它十分可靠。