Java Spring Cloud XVII 之 消息队列
1. 软件下载
doc.canglaoshi.org
2. Dubbo远程调用的性能问题
Dubbo调用在微服务项目中普遍存在
这些Dubbo调用都是同步的
"同步"指:A(消费者)调用B(生产者)的服务A在发起调用后,在B返回之前只能等待
直到B返回结果后A才能运行
Dubbo消费者发送调用后进入阻塞状态,这个状态表示改线程仍占用内存资源,但是什么动作都不做
如果生产者运行耗时较久,消费者就一直等待,如果消费者利用这个时间,那么可以处理更多请求,业务整体效率
实际情况下,Dubbo有些必要的返回值必须等待,但是不必要等待的服务返回值,我们可以不等待去做别的事情
这种情况下我们就要使用消息队列
3. 什么是消息队列
消息队列(Message Queue)简称MQ
消息队列是采用"异步(两个微服务项目并不需要同时完成请求)"的方式来传递数据完成业务操作流程的业务处理方式
4. 消息队列的特征
常见面试题:消息队列的特征
- 利用异步的特性,提高服务器的运行效率,减少因为远程调用出现的线程等待\阻塞
- 削峰填谷:在并发峰值超过当前系统处理能力时,我们将没处理的信息保存在消息队列中,在后面出现的较闲的时间中去处理,直到所有数据依次处理完成,能够防止在并发峰值时短时间大量请求而导致的系统不稳定
- 消息队列的延时:因为是异步执行,请求的发起者并不知道消息何时能处理完,如果业务不能接收这种延迟,就不要使用消息队列
5.常见消息队列
- Kafka:性能好\功能弱:适合大数据量,高并发的情况,大数据领域使用较多
- RabbitMQ:功能强\性能一般:适合发送需求复杂的消息队列,java业务中使用较多
- RocketMQ:阿里的
- ActiveMQ:前几年流行的,老项目可能用到
常见面试题:消息队列异常处理
如果我们真的将上面生成订单业务里,减少库存的操作从正常流程中剥离到消息队列
那么如果库存减少过程中发送异常,就不能由Seata接收了,因为异步的处理无法和Seata通信
意思是如果使用了消息队列,队列中处理数据过程发送异常,那么就要用特殊的方法处理问题
处理方式就是手写代码进行回滚,一般情况就是在stock,模块再向order模块发送消息,order模块接收到消息后进行进一步处理
如果order模块进一步处理时又发生异常,我们可以再向一个实现设置好的消息队列中发送消息
这个消息队列没有处理者,我们称之为"死信队列",一个正常运行的程序,会定期有人处理死信队列信息
我是将军;我一直都在,。!