RabbitMQ
1.为什么使用MQ?优点是什么
因为MQ可以异步处理,提高系统吞吐量。
应用解耦,系统之间可以通过消息通信,不关心其他系统的处理。
流量削峰,可以通过消息队列的长度,控制请求量。可以缓解短时间内的高并发请求。
解耦:A->BCD,但是如果E也想要这个数据,或者C不想要了。A就需要修改。与各种下游系统严重耦合。
如果使用MQ,A系统产生一条消息,到MQ,哪个系统要消息就去消息系统里去消费。
异步:A接收请求,在本地写库,在BCD三个系统分别要进行写库,本地很快,其它系统完成后传过来很慢,如果同步方式,
A需要BCD都完成之后,才能返回给前端,用户会觉得好慢。如果使用异步化处理的话,A本地写库完成,再往消息队列里写一个数据,就可以返回了。
削峰:大流量来的时候,系统可能承受不住这么大的压力,如果用MQ,就可以对这些请求不用急着处理,转化为MQ里的消息数据,然后以恒定的速率吐出。
2.消息队列有什么缺点?
系统可用性降低:MQ挂了,系统就挂了,增加环节就是在增加风险。
复杂性提高:要考虑的问题多了:比如一致性问题(A的消息给BCD用,BC成功,D失败,就是不一致了),如何保证消息不被重复消费,如何保证消息可靠性传输。
3. 不同的MQ的对比?
- ActiveMQ 老牌消息中间件,很多公司运用的很广泛,功能强大,但是互联网公司的高并发扛不住。一般在传统企业,做异步调用,系统解耦。
- RocketMQ 阿里开源的,超高并发、高吞吐,性能好,基于java。
- rabbitMQ 支持高并发,高吞吐,性能很高,同时有完善的后台管理界面。还支持集群化,高可用部署架构,功能完善。但是缺点是基于erlang开发,不好研究源码。
- kafka功能少,优势在于专为超高吞吐量的实时日志采集,实时数据同步,实时数据计算等场景来设计。用在日志或者大数据计算方面比较多。
4.为啥使用rabbitMq不用RocketMQ?
rocketMQ不够稳定,社区活跃度不高,rabbitMQ很稳定。
5.MQ有哪些常见问题?如何解决?
- 消息的顺序性问题
- 单线程化。比如一个订单的各种状态,下单,付款,发货,如果有多个队列,要按照id保证进入一个队列。
- 一个队列对应一个消费者,这样就能保证顺序。
- 或者一个队列可以对应多个消费者,但是消费者在业务逻辑内部要做判断,如果订单还在下单阶段就收到了发货的消息,那就只能抛出异常,回复nack,让rabbitMQ重发。
- 消息的重复问题
- 为了确