竹笋

首页 » 问答 » 灌水 » 为啥要用消息队列MQ,几大主流MQ框
TUhjnbcbe - 2024/6/4 20:00:00
北京治疗白癜风的中药 https://m.39.net/disease/a_12820813.html

消息队列

即MessageQueue,我们从数据结构来理解的话,Queue是一种先进先出的数据结构。所以意思就是将信息(通常指传输的数据)放入一个队列中。

消息队列的两种模式:

点对点模式

可以看到,点对点模式下有可以有多个消费者,但是对于同一个消息,只会有一个消费者能访问。通常可以用于异步推送消息,保存日志等。

发布订阅模式

发布订阅模式下,对于同一个主题(topic),任何订阅了topic的消费者都能拉取此消息。通常可以用于构建消息系统。

在项目中使用了消息队列有哪些优势呢?

解耦。各个系统之间不存在直接调用。而是通过消息的传输方式去达成业务需求,这个对于系统的侵入性很低。提高系统的性能。异步处理的重要性。便于分布式扩容。原来的代码不需要改动,只需要增加新的功能就行。数据持久化。保证部分场景下,数据的有序性。数据流处理。能更好、实时的处理大数据统计和分析。分析下市面上比较流行的几种MQ,ActiveMQ、RabbitMQ、Kafka、RocketMQ。

ActiveMQ

由Apache软件基金会所开源,基于java语言开发。算是一个很老的MQ框架了,同时也是一个非常成熟的框架了,早期在很多互联网公司得到广泛的应用。

文档齐全,支持多种语言,支持多种的高级特性,如消息组、通配符、组合队列等。同时对Spring有很好的支持,可以轻易的通过配置文件集成到系统中。

缺点:

吞吐量低。ActiveMQ持久化信息的时候是需要建立索引的,写性能下降,导致吞吐量下降。没有分片功能。当一个服务器承受不了更多的消息,就需要进行切分了。而ActiveMQ不支持,需要自己去实现。版本迭代较慢。RabbitMQ

基于Erlang语言编写的一套开源(MPL)的消息队列服务软件,Erlang语言以高性能、健壮、可伸缩出名,所以RabbitMQ性能很强,吞吐量也很高,支持多种协议,集群化,消息的可靠执行特性等优势,很适合企业的开发。

缺点:

吞吐量较低。由于RabbitMQ支持的协议多,所以如果要好好学习的话,成本较高。Kafka

由linkedin开源的,基于scala语言实现的一个高性能分布式Publish/Subscribe消息队列系统。

其实Kafka的由来也挺有意思的。话说linkedin起初是使用ActiveMQ来进行数据系统中数据交换的,上面都说了ActiveMQ性能不咋滴,所以linkedin决定研发自己的消息传递系统,也就是Kafka。

Kafka跟其余的消息中间件比较,那是出名的第一快,以并发量大,社区活跃备受广大组织的喜爱。

Kafka提供了超高的吞吐量,ms级别的延迟,极高的可用性以及可靠性,而且分布式可以任意扩展,还支持大数据框架Hadoop数据并行加载。

缺点:

单机队列不能太高,超过64会导致性能下降。消息重复消费。对数据准确性会产生影响。缺乏一套完整的管理和监控工具。消费失败不支持重试。RocketMQ

由阿里开源,基于Java实现的一套分布式消息中间件,已经捐献给Apache基金会。

起初阿里也使用ActiveMQ做消息系统,可能也是由于性能、可用性问题,然后才自研RocketMQ。

RocketMQ思路起源于Kafka,单机吞吐量高,消息的高可靠性,如果做好了参数配置,基本不会存在消息丢失的可能,扩展性强,支持事务等。再怎么说,RocketMQ好歹经历过淘宝双11的压力,在阿里内部项目中广泛应用。

缺点:

支持的语言极少,就java和c++。社区活跃明显比不上kafka和RabbitMQ。功能不够完整,没去实现JMS接口,系统迁移需要修改大量的代码,增加了维护成本。我们公司目前使用的集群RabbitMQ,你们使用的哪一个?

1
查看完整版本: 为啥要用消息队列MQ,几大主流MQ框