1 简述MQ
MQ:MessageQueue,消息队列。 队列,是一种FIFO 先进先出的数据结构。消息由生产者发送到MQ进行排队,然后按原来的顺序交由消息的消费者进行处理。QQ和微信就是典型的MQ。
2 为什么使用消息队列啊?
比较核心的有3个:解耦、异步、削峰
2.1 解耦
解耦前:
解耦后:
1.如果有一个新系统接入,需要A系统数据,A系统就要去写代码给新系统提供对应的数据.如果有MQ,新系统直接去消费即可,不需要A修改代码
2.就算调用对方接口,还需要考虑是否对方能收到,是否需要重试,引入mq就可以解决
2.2 异步
使用异步后添加三个mq进行处理消息
1.异步提升并发量
2.提升效率,不必要考虑对方是否接收消息成功与否
2.3 削峰
采用MQ削锋可以积压消息不至于卡死,等高峰期过了之后慢慢处理
1.积压到mq,慢慢来消费不至于让系统一下子被打死
3 消息队列缺点
优点上面已经说了,就是在特殊场景下有其对应的好处,解耦、异步、削峰
缺点呢?显而易见的
1.系统可用性降低(MQ挂了):MQ挂了,整套系统崩溃了。
2.系统复杂性提高:重复消费、消息丢失、消息传递的顺序性
3.一致性问题:A系统处理完了直接返回成功了,人都以为你这个请求就成功了;但是问题是,要是BCD三个系统那里,BD两个系统写库成功了,结果C系统写库失败了,数据就不一致了。
所以消息队列实际是一种非常复杂的架构,你引入它有很多好处,但是也得针对它带来的坏处做各种额外的技术方案和架构来规避掉,系统复杂度提升了一个数量级,也许是复杂了10倍。但是关键时刻,用,还是得用的。
4 kafka、rabbitmq、rocketmq优点和缺点
5 总结
大概对比一下几大主流MQ的优缺点。ActiveMQ因为吞吐量低,也没有什么突出的优势,用的人也少了。RabbitMQ主要特点是消息延迟低,并发能力强,而且安全可靠,所以并发量不是很大的金融行业据说用的多,互联网公司可能用的少,因为他的开发语言是Erlang,可能懂得人不多,出问题不好定位。而RocketMQ是阿里开源的MQ,并发高,功能多,用的好像挺多。Kafka主要用在大数据领域。这些话呢,也主要是网上看的,并没有实际调研过,有确切的数据,不过理论上是可信的。