MQ有什么用?有哪些具体的使用场景? #
MQ:MessageQueue,消息队列。队列是一种FIFO先进先出的数据结构。消息由生产者发送到MQ进行排队,然后由消费者对消息进行处理。QQ、微信就是典型的MQ场景。
MQ的作用主要有三个方面:
- 异步:能提高系统的响应速度和吞吐量。更像是快递中的驿站,快递员->菜鸟驿站<-客户。
- 解耦:服务之间解耦,可以减少服务之间的影响,提高系统的稳定性和可扩展性。另外,解耦之后可以实现数据分发。生产者发送一个消息后,可以由多个消费者来处理。
- 削峰:以稳定的系统资源应对突发的流量冲击。
MQ的缺点:
- 系统可用性降低,一旦 MQ 宕机,整个业务会产生影响。高可用
- 系统复杂度提高,引入 MQ 之后,数据链路会变得很复杂。如何保证消息不丢失?消息不回重复调用?怎么保证消息的顺序性?
- 数据一致性:A系统发消息,需要由B、C两个系统一同处理。如果B系统处理成功、C系统处理失败,就会造成数据一致性问题。
2. 如何进行产品选型? #
-
kafka
- 优点:吞吐量非常大,性能非常好,集群高可用。
- 缺点:会丢数据,功能比较单一。
- 使用场景:日志分析,大数据采集。
-
rabbitMQ
- 优点:消息可靠性高,性能全面。
- 缺点:吞吐量比较低,消息积累会严重影响性能。erlang语言不好定制。
- 使用场景:小规模场景。
-
rocketMQ
- 优点:高吞吐、高性能、高可用,功能非常全面
- 缺点:开源版功能不如云上版本。官方文档和周边生态还不够成熟。客户端只支持JAVA。
- 使用场景:几乎是全场景。
特性 | Kafka | RabbitMQ | RocketMQ |
---|---|---|---|
发行年份 | 2011 | 2007 | 2012 |
语言 | Scala和Java | Erlang和Java | Java |
协议 | 自定义协议(Kafka协议) | AMQP、STOMP、MQTT | 自定义协议 |
消息模型 | Pub-Sub、队列 | Pub-Sub、点对点 | Pub-Sub、点对点 |
消息持久化 | 是 | 是 | 是 |
消息顺序 | 有序 | 有序 | 有序 |
分区 | 是 | 否 | 是 |
可用性 | 高 | 高 | 高 |
性能 | 高 | 一般 | 高 |
社区活跃度 | 高 | 高 | 高 |
部署复杂性 | 中 | 低 | 中 |
3. 如何保证消息不丢失? #
哪些环节会造成消息丢失?
怎么去防止消息丢失?
- 生产者发送消息不丢失
- kafka:消息发送+回调
- rocketMQ:
- 消息发送+回调
- 事务消息
- MQ主从消息不丢失
- MQ消息存盘不丢失
- MQ消费者消费消息不丢失