常见MQ的选择

MQ(Message Queue)消息队列,指把要传输的数据(消息)放在队列中,用队列机制来实现消息传递。现代系统中或多或少都会用到MQ,同时MQ作为分布式系统中的重要组件,也是面试必问的考点之一。

消息队列的使用场景主要包括以下几点:

一、异步处理

一个核心多步骤的流程可以把多个步骤拆分出来分为核心的和非核心步骤,一个情况过来可以先处理核心步骤(扣减库存),然后通过消息队列来处理余下的非核心步骤(生成订单、发送短信),同步处理的流程大大缩短,可以极大的提高系统的请求的响应时间和系统的吞吐量。

二、流量控制

类似秒杀等场景这种瞬时高流量,可以在网关和后端服务之间加入消息队列,以达到控制流量和保护后端服务的作用。
加入消息中间件以后,整个秒杀流程变为:
1.网关接收到秒杀请求以后,向消息中间价投递消息后可以快速响应。
2.后端服务从消息中间件中获取消息,完成后续秒杀步骤。
这种设计的优点是:
能够根据下游的处理能力自动调节流量,打到“削峰填谷的”作用。
同时这样做也需要付出一定的代价:
1.增加了系统调用的步骤,总体的响应时间边长。
2.同步调用改为异步处理,增加了系统的复杂性。

三、服务解耦

消息队列的另外一个作用,就是实现系统应用之间的解耦。

当一个事件的发生需要通知多个系统时,不需要上游系统一一调用下游系统的接口进行通知,可以采用MQ向某个主题投递消息,下游关注该消息的系统只需订阅该主题,事件发生时,订阅该系统的下游系统都可以收到该消息。

这种设计的好处是,无论增加、减少下游系统或是下游系统需求如何变化,上游服务都无需做任何更改,实现了上游服务与下游服务的解耦。

常见的消息队列:
市面上常见的消息队列主要包括RabbitMQ、RocketMQ、Kafka、ActiveMQ、ZeroMQ、Pulsar等。

RabbitMQ:

特点:1. 相当轻量级的消息队列,非常容易部署和使用。
	 2. 使用广泛。
	 3. 支持灵活的路由配置。
	 4. RabbitMQ 的客户端支持的编程语言非常多,如果你的系统是用某
种冷门语言开发的,那你多半可以找到对应的 RabbitMQ 客户端。
不足:1. RabbitMQ 对消息堆积的支持并不好,在它的设计理念里面,消息队列是一个管道,大量的消息积压是一种不正常的情况,应当尽量去避免。当大量消息积压的时候,会导致 RabbitMQ 的性能急剧下降。
     2. RabbitMQ的性能相对较差。
     3.  RabbitMQ 使用的编程语言 Erlang,这个编程语言不仅是非常小众的语言,而且学习曲线非常陡峭。

RocketMQ

RocketMQ 是阿里巴巴开源的消息队列产品,后来捐赠给 Apache 软件基金会。
经历过多次“双十一”考验,它的性能、稳定性和可靠性都是值得信赖的。作为优秀的国产消息队列,近年来越来越多的被国内众多大厂使用。

特点:1. RocketMQ 有非常活跃的中文社区。
	  2. RocketMQ 使用 Java 语言开发,它的贡献者大多数都是中国
人,源代码相对也比较容易读懂,你很容易对 RocketMQ 进行扩展或者二次开发。
     3.RocketMQ 的性能比 RabbitMQ 要高一个数量级,每秒钟大概能处理几十万条消息。
     不足:
     RocketMQ 的一个劣势是,作为国产的消息队列,相比国外的比较流行的同类产品,在国际上还没有那么流行,与周边生态系统的集成和兼容程度要略逊一筹。

Kafka

Kafka 最早是由 LinkedIn 开发,目前也是 Apache 的顶级项目。
Kafka 最初的设计目的是用于处理海量的日志。在早期的版本中,为了获得极致的性能,在设计方面做了很多的牺牲,比如不保证消息的可靠性,可能会丢失消息,也不支持集群,功能上也比较简陋,这些牺牲对于处理海量日志这个特定的场景都是可以接受的。
随后的几年 Kafka 逐步补齐了这些短板,网上搜到的很多消息队列的对比文章还在说 Kafka 不可靠,其实这种说法早已经过时了。
当下的Kafka 已经发展为一个非常成熟的消息队列产品,无论在数据可靠性、稳定性和功能特性等方面都可以满足绝大多数场景的需求。
Kafka 与周边生态系统的兼容性是最好的没有之一,尤其在大数据和流计算领域,几乎所有的相关开源软件系统都会优先支持 Kafka。

ActiveMQ

ActiveMQ 是最老牌的开源消息队列,是十年前唯一可供选择的开源消息队列,目前已进入老年期,社区不活跃。
无论是功能还是性能方面,ActiveMQ 都与现代的消息队列存在明显的差距,它存在的意义仅限于兼容那些还在用的爷爷辈儿的系统。

消息队列的选择:

如果你对消息队列功能和性能都没有很高的要求,只需要一个开箱即用易于维护的产品,建议使用 RabbitMQ。
如果你的系统使用消息队列主要场景是处理在线业务,比如在交易系统中用消息队列传递订单,那 RocketMQ 的低延迟和金融级的稳定性是你需要的。
如果你需要处理海量的消息,像收集日志、监控信息或是前端的埋点这类数据,或是你的应用场景大量使用了大数据、流计算相关的开源产品,那 Kafka 是最适合你的消息队列。

猜你喜欢

转载自blog.csdn.net/hxj413977035/article/details/121073760