为啥要用消息队列(MQ),几大主流MQ框架优劣势,你会怎么选择?
作者:互联网
消息队列
即Message Queue,我们从数据结构来理解的话,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,你们使用的哪一个?
标签:队列,RabbitMQ,Kafka,MQ,消息,ActiveMQ,优劣势,RocketMQ 来源: https://blog.csdn.net/mohuanzhen/article/details/119089376