对线面试官 - 为什么要使用 MQ
面试官:为什么要使用消息队列(MQ)?可以列举一些 MQ 的优点吗?
派大星:当然可以!使用消息队列(MQ)有几个主要的优点:
解耦:通过使用消息队列,系统之间可以实现解耦。一个系统产生的数据可以通过消息队列发布,其他系统可以订阅该消息并消费,而无需直接与数据产生系统进行交互。这种解耦方式降低了系统之间的依赖性,减少了代码维护成本。
异步:消息队列支持异步通信模式,可以提高系统的响应速度。当一个系统调用其他系统的 API 时,同步调用需要等待每个依赖系统逐一完成调用才能返回结果,耗时较长。通过使用消息队列进行异步化,系统可以将调用请求发送到队列中,然后继续处理其他任务,从而大幅缩短调用时间,提高高延时接口的速度。
削峰:在高峰期,大量请求涌入系统时,如果直接将请求发送到数据库等后端存储,可能会导致系统崩溃。通过使用消息队列,系统可以将请求先写入队列中,在低谷时逐个消费请求,从而避免系统崩溃。尽管消息队列中会积压大量请求,但在低谷期可以逐渐消费掉这些请求。
分布式一致性:消息队列可以支持分布式系统中的一致性需求。通过使用合适的消息队列,系统可以保证各个模块执行的结果一致性,避免不同模块之间的数据不一致问题。
点对点消费:消息队列支持点对点的消息消费模式,可以确保消息只被一个消费者接收和处理。这对于一些需要确保消息只被一个接收者处理的场景非常有用。
然而,引入消息队列也可能带来一些问题:
可用性降低:如果消息队列出现问题,可能导致生产者无法发送消息,消费者无法消费消息,从而导致整个系统不可用。
复杂性增加:使用消息队列需要解决一些复杂性问题,例如消息的幂等性、可靠性、顺序性等。如果不正确处理这些问题,可能会导致数据重复、丢失或顺序错乱等一致性问题。
综上所述,根据不同的业务需求和技术实力,选择适合的消息队列是非常重要的。常见的消息队列包括 ActiveMQ、RabbitMQ、RocketMQ 和 Kafka。每种消息队列都有其优缺点,如单机吞吐量、时效性、可用性、消息可靠性和功能支持等方面有所差异。因此,在选择消息队列时,需要根据实际情况综合考虑这些因素。
对于中小型公司来说,技术实力一般,业务挑战不高的情况下,使用 RabbitMQ 是一个不错的选择。RabbitMQ 是一个稳定且活跃的开源项目,有活跃的开源社区支持。
对于大型公司来说,如果具备较强的基础架构研发实力,可以考虑使用 RocketMQ。RocketMQ 是阿里巴巴出品的消息队列系统,具有较高的可用性和消息可靠性。
如果涉及大数据领域的实时计算、日志采集等场景,Kafka 是业内标准的选择,具有高吞吐量和强大的功能支持,拥有活跃的开源社区。
面试官: 讲了那么多 MQ 的优势,你能告诉我消息队列引入系统会导致哪些问题吗?
派大星: 当然可以!引入消息队列(MQ)可能会引发以下问题:
可用性降低:如果 MQ 发生问题,生产者无法发送消息,导致其他消费者系统无法消费消息,整个系统可能会出现故障。
复杂性增加:在使用 MQ 时,可能会出现生产者系统或模块生成相同数据的两条消息发送的情况(消息幂等性);消息可能在发送给 MQ 后还没有被消费者系统或模块消费,导致数据丢失(可靠性);如果消息的顺序发送被 MQ 打乱,消费者系统或模块无法保证按正确顺序消费数据(顺序性);消费者系统的故障可能导致 MQ 中积压大量未消费的数据。
一致性问题:不同系统或模块的执行结果可能不一致,有些成功,有些失败,但用户得到的是成功的响应。实际上,最终的正确结果应该是失败的。
面试官: 那么,能否介绍一下不同 MQ 的优缺点呢?
派大星: 当然可以!以下是几种常见 MQ 的优缺点:
ActiveMQ:
优点:MQ 领域的功能非常完备,具备高可用性的主从架构支持。
缺点:单机吞吐量较低,没有经过大规模吞吐量场景验证,社区活跃度也相对较低。
RabbitMQ:
优点:基于 Erlang 开发,具备并发能力很强、性能很好、延迟很低的特点。MQ 功能较为完善,是分布式系统且扩展性较好。拥有稳定的支持和活跃的开源社区。
缺点:Erlang 语言限制了 Java 工程师深入研究和掌控 RabbitMQ,对公司而言可能存在不可控的状态。
RocketMQ:
优点:由阿里巴巴出品,具备较高的可用性和分布式架构,支持高吞吐量和消息可靠性。常用于大数据领域的实时数据计算和日志采集等场景。
缺点:尽管已捐赠给 Apache,但 GitHub 上的活跃度相对较低,社区可能存在突然不活跃的风险。
Kafka:
优点:具备高吞吐量和消息可靠性,常用于大数据领域的实时计算和日志采集。Kafka 延迟低,支持微秒级的时效性,并具有非常高的可用性和分布式架构。
缺点:相对而言,功能较为简单,主要支持基本 MQ 功能。
综上所述,对于中小型公司而言,如果技术实力一般且不需要处理高吞吐量场景,推荐使用 RabbitMQ。对于大型公司而言,如果具备较强的基础架构研发实力,可以考虑使用 RocketMQ。而在大数据领域的实时计算和日志采集等场景中,Kafka 是业内的首选,因为它具备高可用性和活跃的开源社区支持。
面试官: 非常感谢你的总结!有其他问题需要解答吗?
派大星: 目前我没有其他问题需要解答,谢谢!如果您还有其他问题,请随时提问。
如有问题,欢迎加微信交流:w714771310,或关注微信公众号【码上遇见你】。
版权声明: 本文为 InfoQ 作者【派大星】的原创文章。
原文链接:【http://xie.infoq.cn/article/fe4d9326890131a70ed6584cf】。
本文遵守【CC BY-NC-ND】协议,转载请保留原文出处及本版权声明。
评论