Skip to main content

java面经-MQ篇

·91 words·1 min
WFUing
Author
WFUing
A graduate who loves coding.
Table of Contents

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:
      1. 消息发送+回调
      2. 事务消息
  • MQ主从消息不丢失
  • MQ消息存盘不丢失
  • MQ消费者消费消息不丢失

💬评论