一、MQ的意义
主要目的 :解耦、异步、削峰
解耦:一个业务需要多个模块共同实现,或者一条消息有多个系统需要对应处理,只需要主业务完成以后,发送一条MQ,其余模块消费MQ消息,即可实现业务,降低模块之间的耦合
异步:主业务执行结束后从属业务通过MQ,异步执行,减低业务的响应时间,提高用户体验
削峰:高并发情况下,业务异步处理,提供高峰期业务处理能力,避免系统瘫痪
二、MQ的优点
优点:解耦、异步、削峰
缺点:1、系统可用性降低。依赖服务也多,服务越容易挂掉。需要考虑MQ瘫痪的情况
2、系统复杂性提高。需要考虑消息丢失、消息重复消费、消息传递的顺序性
3、业务一致性。主业务和从属业务一致性的处理
三、常用MQ
常用MQ : rocketmq、rabbitmq、activemq、kafka
rocketmq:alibaba使用Java语言开发的MQ,2012年开源,交由Apache管理,支持消息重复消费,目前社区不算活跃
rabbitmq:使用erlang语言开发,高并发性能好,社区活跃最高,支持消息持久化
activemq:社区活跃度搞,支持消息持久化
kafka:性能好(吞吐量、TPS)
四、MQ的区别
五、MQ常见问题的解决
1、如何保证高可用
集群部署,详情各MQ集群部署方案
2、如何保证消息不被重复消费,保证消息的幂等性
a、消息消费前,先通过业务校验是否消费国
b、通过数据库索引,保证消息只消费一次
3、如何保证消息可靠传输,不被丢失
生产者丢失
MQ中丢失
消费端丢失
4、如何保证消息顺序性
参考各MQ实现细节
5、如何解决消息队列积压问题
先修复consumer的问题,确保其恢复消费速度
创建一个新的topic,空间是原先的10倍,queue也创建原先的10倍
写一个临时的consumer程序,去消费积压的消息,消费之后不做特殊处理,直接轮询写入临时创建的queue里面,直至消费结束
临时征用10倍的机器来部署原先的xonsumer,每一个消费一个临时的queue。等消费完,恢复原先部署的架构
6、如何解决消息失效的问题
消息如果长期积压,达到消息的有效日期,就会过期。可以采取批量重导,就是先临时大量消费消息(存储消息到数据库,或者日志,或者redis),等高峰过了以后,通过程序恢复消息,重新消费
六、MQ面试题