`
y806839048
  • 浏览: 1126829 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

activemq、rabbitmq、kafka,zeromq原理和比较

阅读更多

 

总概:

 

active:  主存储备份  只有failover切换模式  先消费后删除

queue

 

messagegroup  就是queue的概念,只要一个群中的都可以消费

 

topics

 

消费者订阅自己感兴趣的主题

 

rabbitmq:分布式存储+备份(全量queue数据效率低) ---一般应用优先   (特点可以根据不同主题key建立不同队列)-指定入队  先消费后删除

 

 

rabbitmq的主题就是交换器,通过key对应到不同的帮定队列(分类消息队列),消费端直接消费即可无需关注来于哪个队列

 

rabbitmq有磁盘节点,内存节点,磁盘节点分布存储exchange,queue信息(尽管也复制全量队列数据到其他机器,但复制性能低)

exchanger相当于queue的管理者不需要想activemq那样一个一个配置queue,直接绑定exchanger和queue即可,exchanger自己切换

 

 

 

利用rabbitmq多个queue的特性可以每个多步顺序事物可以放在一个队列中,顺序执行,执行完删除队列,有新的session线程请求又建立新的队列(基于session线程请求)

 

 

kafa:分布式存储  + part备份(各个partion冗余效率高)---集群优先---指定消费   消费后存储一段时间

partion可以倾向调节(数量调整)

 

一、activemq

    虽然是java写的消息队列,但是提供Java, C, C++, C#, Ruby, Perl, Python, PHP各种客户端,所以语言上是没什么问题的。配置和使用,基本上是java xml这一套。同时对jms、spring之类的支持很友好。

    而且因为是Java写的,所以可以作为一个jar包,放到java项目里,用代码启动和配置,这个对于java开发者而言是不是相当爽?毕竟还是有些场景,需要我们把队列放到自己项目内部,随项目启动而启动的。而且,还可以类似拓展tomcat一样,自己写java的plugin来拓展activemq。比如说,我有10万硬件连到mq上,这10万设备每个都有用户名密码,这个时候我们可以用java写个权限验证,从数据库里查这10万用户名密码。

    activemq支持主从复制、集群。但是集群功能看起来很弱,只有failover功能,即我连一个失败了,可以切换到其他的broker上。这一点貌似不太科学。假设有三个broker,其中一个上面没有consumer,但另外两个挂了,消息会转到这个上面来,堆积起来。看样子activemq还在升级中。

    activemq工作模型比较简单。只有两种模式 queue,topics 。

    queue就多对一,producer往queue里发送消息,消费者从queue里取,消费一条,就从queue里移除一条。如果一个消费者消费速度不够快怎么办呢?在activemq里,提供messageGroup的概念,一个queue可以有多个消费者,但是他们得标记自己是一个messageGroup里的。这样,消息会轮训发送给每个消费者,也就是说消费者不会重复消费同一条消息。但是每条消息只被消费一次。

    topics就是广播。producer往broker发消息,每个消息包含topic。消费者订阅感兴趣的topic,所有订阅了topic的消费者都会收到消息。当然订阅分持久不持久。持久订阅,当消费者断开一会,再连上来,仍然会把没收到的消费发过来。不持久的订阅,断开这段时间的消息就收不到了。

    activemq支持mqtt、ssl。

 

二、rabbitmq

    rabbitmq用erlang写的。安装完才10m不到,在windows上使用也非常方便,在这点上完爆了activemq,java又臭又长没办法啊。rabbitmq给我感觉更像oracle,功能非常强大。安装完,也有实例的概念,可以像建数据库一样,建实例,建用户划权限。同时监控系统也很好用。这些都是好处,同时也是累赘,整体上来说rabbitmq比activemq复杂太多了。

    从机制上来讲,rabbitmq也有queue和topic的概念,发消息的时候还要指定消息的key,这个key之后会做路由键用。但是,多了一个概念叫做交换器exchange。exchange有四种,direct、fanout、topic(key可以用通配符的方式匹配)、header。也就是说,发消息给rabbitmq时,消息要有一个key,并告诉他发给哪个exchange。exchange收到之后,根据key分发或者广播给queue。消费者是从queue里拿消息的,并接触不到交换机。

    在rabbitmq里,有各种默认行为,如果我们不指定exchange,会有个默认的direct类型的exchange,如果不指定队列和交换器的绑定关系,默认就按消息的key绑定对应的queue。此时发一个消息,消息的key是什么,就会被默认交换器送给对应的queue。

此时,其实等同于activemq的queue模式。

在rabbitmq里,一个queue可以有多个消费者

通过设置prefetch的值为1,可以让多个消费者每次都取到一条记录,消费完再取下一条。这两种都是使用direct交换器,即消息的key是多少,就把消息放到key对应的queue中。

    fanout交换器。实际上就是广播,发送到fanout交换器的消息,会被转发给所有和这个交换器绑定的队列。通常我们把队列搞成临时的,这样就解耦了。例如用户登录,发送一个登陆消息到fanout交换器,同时有一个smsQueue和交换器绑定,一个消费者从这个smsQueue里取出谁登陆了,并发送一条短信。过了几天,我们希望用户登陆可以获得积分。那么我再声明一个scoreQueue绑定到这个fanout交换器,实现积分更改逻辑。下图是fanout(X为交换器)

    总体说来fanout其实就是direct交换器实现的。把两个队列都绑定到direct,绑定的时候指定同一个key,就变成fanout交换器了,如下图

    queue和exchange绑定的时候,也可以指定多个绑定key,这时候就实现了简单版的订阅。如下图

当然这样不够灵活,我想要靠通配符绑定如何呢,这时候就不用direct交换器了,用topic交换器

    “#”通配剩余字符,"*"通配部分字符。 如果绑定的时候key为“#”,那么其实就是fanout交换器。如果一个通配符都没有,其实就是direct交换器。

    head交换器貌似是通过消息附带的头信息来路由的,不过官方对这个介绍的少之又少,平时也应该没什么人用,死信队列貌似依赖于这个。

    通过交换器的概念,rabbitmq在机制上要比activemq灵活不少。对于activemq来说,你要么是个queue的消费者,要么是个topic的订阅者。你要同时订阅多个topic,要自己在消费者端写代码来实现。在rabbitmq中,你只是queue的消费者,至于你这个queue的消息是从哪个topic来,或者从哪里直接发过来,这个和消费者没有关系,而且queue里的消息从哪来可以在rabbitmq里动态配置。所以灵活度得到了提升。

 

    rabbitmq同样也支持主从复制和集群。但是rabbitmq的集群非常多样化,而且需要至少一台机器做为磁盘节点,可以持久化queue和exchange的信息,其他的可以为内存节点。普通集群中,只有exchange,queue这些定义是分布在所有机器上的,而queue中的数据不是冗余的,比如有三台rabbitmq组成了集群,他们共享同样的exchange,queue,但是一条消息数据落到了第一台机器上,另外两台实际上没有这条数据的。 对于整个集群的使用,这样其实没有任何问题。  但出于高可用的角度来想,还是需要完完全全的分布式集群的,万一中间有数据这台机器挂了? rabbitmq对此也有支持,把队列数据也冗余存到三台机器上,称之为镜像队列,但性能要比普通集群低,毕竟一条消息被复制到其他机器上是耗时的事情。

    rabbitmq以plugin的形式支持mqtt,和spring整合也非常简单。

 

三、kafka

    kafka号称为分布式而生。和activemq以及rabbitmq这些企业级队列而言确实更有分布式系统的优势。

    

    kafka中,只有topic,但是每个topic可以有很多partition分区。上图中kafka集群由两台机器组成。topic被分成四个分区,server1维护p0,p3。 在kafka中,每个消费者都要指出自己属于哪个consumerGroup,每个consumer可以读取多个partition。但是一个partition在同一个consumerGroup中,只会被一个consumer消费(也只能被一个消费者消费,无论是否在一个消费群中)。以此保证不会重复消费。而且在一个partition中,消息被消费的顺序是可保障的。上图中,consumer group A 由两个consumer组成,因此一个consumer可以消费两个partition。如果要保证严格的顺序性,那么就要像consumer group B一样,每个consumer只消费一个partition。kafka和rabbitmq及activemq机制上略有区别。rabbitmq和activemq都是消费后就删除消息,没有重复消费的功能,而kafka 队列中的内容按策略存储一定时间,消费者通过指定偏移量来读取数据。如果使用基础api可以从任意位置读取。kafka同时提供高级api,即kafka来维护每个消费者当前读到什么位置了,下次再来,可以接着读。

    kafka中partition是冗余存储的。如果一个partition不幸挂了,通过选主,马上可以切换到另外一台机器上继续使用。这一点上,是当之无愧的分布式队列。相比之下,rabbitmq需要配置镜像队列,操作太麻烦。kafka搭建集群也是非常简单。

    kafka的优势在于: 传统的消息队列只有两种模式,要么是queue,要么是publish-subscribe发布订阅。在queue模式中,一组消费者消费一个队列,每条消息被发给其中一个消费者。在publish-subscribe模式中,消费被广播给所有消费者。queue模式的好处在于,他可以把消费分发给一组消费者,从而实现消费者的规模化(scale);问题在于,这样一个消息只能被一组消费者消费,一旦消费,消息就没有了。publish-subscribe的好处在于,一个消息可以被多组消费者消费;问题在于,你的消费者没法规模化,即不可能出现多个消费者订阅同一个topic,但每个消费者只处理一部分消息(虽然这个可以通过设计topic来解决)。

    kafka的设计意义在于,大家都publish-subscribe,因为我的队列数据是不删除的,多个subscriber可以订阅同一个topic,但是各自想从哪读,从哪读,互不干扰。同时提出了consumer group的概念。每个subscriber可以是多个consumer组成的,在consumer group内部,你们自己分配,不要两个人消费同一条数据。为了达到这种目的,一个topic里的消息,被分成多个partition,既实现了上面的想法,同时又冗余(一个partition可以冗余存储在多台机器上),达到分布式系统的高可用效果。

    kafka也支持mqtt,需要写一个connecter。kafka还提供流式计算的功能,做数据的初步清理还是很方便的。

 

    总体而言。我感觉kafka安装使用最简单,同时,如果有集群要求,那么kafka是当仁不让的首选。尤其在海量数据,以及数据有倾斜问题的场景里,因为partition的缘故,数据倾斜问题自动解决。比如个别Topic的消息量非常大,在kafka里,调整partition数就好了。反而在rabbitmq或者activemq里,这个不好解决。

    rabbitmq是功能最丰富,最完善的企业级队列。基本没有做不了的,就算是做类似kafka的高可用集群,也是没问题的,不过安装部署麻烦了点。

    activemq相对来说,显的老套了一些。不过毕竟是java写的,在内嵌到项目中的情况下,或者是简单场景下,还是不错的选择。

 

 

 

补充一下。在kafka中,创建一个topic是一个比较重的操作,因为是分布式的,topic要同步到其他的broker,中间还要经过zookeeper。所以kafka仅仅做mqtt的输入是ok的,但是你需要给每个硬件推送消息,实际上不太好。这方面反倒是rabbitmq比较好,因为在rabbitmq中创建几万的topic是很容易的,所以是可以做到每个硬件订阅不同的topic。

 

ZeroMQ

  ZeroMQ与其他MQ类似,也实现了3中最基本的工作模式:发布-订阅,请求-应答,管道

博文地址:http://www.2cto.com/kf/201606/514211.html

特点: 高到离谱的吞吐量、可自行开发持久化、支持数据量较小的持久化、不过只是保存到内存中。 
除了点对点 即:请求-应答模式 是一对一 、不可有消息丢失 、其他都没有对消息丢失做强烈的保证、 
官方给出的观点:我们希望消息的尽快送达、而不介意消息的丢失

zeromq的目标是成为网络协议栈的一部分、进而进军linux 内核 、所以与Rabbit Active 有着本质以及目标的区别

分享到:
评论

相关推荐

    消息中间件kafka与activemq、rabbitmq、zeromq、rocketmq的比较

    #### Kafka与Activemq、Rabbitmq、ZeroMq、Rocketmq的比较 在现代分布式系统中,消息中间件(Message Queue, MQ)扮演着至关重要的角色,它们用于在分布式组件之间传输消息,帮助解决网络延迟、组件故障等问题,...

    浅谈Java消息队列总结篇(ActiveMQ、RabbitMQ、ZeroMQ、Kafka)

    常用的消息队列有 ActiveMQ、RabbitMQ、ZeroMQ、Kafka、MetaMQ、RocketMQ 等。 Java 消息队列的应用场景: 1. 异步处理:引入消息队列,将不是必须的业务逻辑异步处理,解决系统性能瓶颈问题。 2. 应用解耦:引入...

    RabbitMq实例以及安装包

    ZeroMq 不支持,ActiveMq 和RabbitMq 都支持。持久化消息主要是指我们机器在不可抗力因素等情况下挂掉了,消息不会丢失的机制。 3.综合技术实现 可靠性、灵活的路由、集群、事务、高可用的队列、消息排序、问题追踪...

    消息中间件技术选型,包括ActiveMQ、Apollo、RabbitMQ、RocketMQ、Kafka、Redis、ZeroMQ

    消息中间件技术选型,ActiveMQ、Apollo、RabbitMQ、RocketMQ、Kafka、Redis、ZeroMQ多维护对比分析

    消息中间件之ActiveMQ视频课程

    当前使用较多的消息中间件有RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMQ等。本套视频以Apache的ActiveMQ作为切入点,分为基础/实战/面试上中下三大部分,带你从零基础入门到熟练掌握ActiveMQ,能够结合...

    MQ之ActiveMQ.mmap

    当前使用较多的消息中间件有RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMQ等, 本次以Apache的ActiveMQ作为切入点,分为基础/实战/面试上中下三大部分,将带着同学们 从零基础入门到熟练掌握ActiveMQ,能够...

    MQ选型之RabbitMQ

    在这些方面,**RabbitMQ和Kafka表现最佳**,而ActiveMQ略逊一筹,ZeroMQ则相对较弱。 ##### 3.4 高并发能力 RabbitMQ之所以能在高并发场景下表现出色,很大程度上得益于其实现语言——**Erlang**。Erlang是一门...

    RabbitMQ 讲义.pdf

    目前市场上主流的消息队列产品包括ActiveMQ、ZeroMQ、RabbitMQ、RocketMQ和Kafka。其中,ActiveMQ基于JMS协议,而ZeroMQ是基于C语言开发,RabbitMQ基于AMQP协议并使用Erlang语言编写,RocketMQ是阿里巴巴基于JMS协议...

    kafka的使用场景.docx

    虽然市场上有多种消息中间件,如ActiveMQ、RabbitMQ、ZeroMQ、MetaMQ、RocketMQ等,但Kafka以其高吞吐量、低延迟和可持久化特性,在大数据处理和实时流应用中脱颖而出。 四、Kafka在电商系统中的应用 电商系统中,...

    kafka集群方案选型

    在当前的消息中间件产品市场中,存在多种选择,包括ActiveMQ、RabbitMQ、RocketMQ、Kafka、ZeroMQ等。每种产品都有其优缺点,本文将对这些产品进行比较,阐述Kafka集群方案选型的必要性和可行性。 一、消息中间件...

    rabbitmq学习资料

    RabbitMQ作为一个中间件,本质上是一个消息的代理,在这个领域还有ActiveMQ、RocketMQ、 ZeroMQ、Joram、Kafka等等。其中ActiveMQ是Apache公司开源的消息系统,使用Java语言开发,功能 较为完善,被大量开源项目所...

    分布式架构之消息队列.pdf

    在实际生产环境中,常见的消息队列中间件有ActiveMQ、RabbitMQ、ZeroMQ、Kafka、MetaMQ和RocketMQ等。 **消息队列工作原理** 消息队列通常包含三个角色:队列服务端、消息生产者和消息消费者。服务端负责接收和...

    消息队列1

    本文将围绕标题"消息队列1"和描述中的内容,探讨几个主流的消息队列系统,包括Kafka、RabbitMQ、ZeroMQ和RocketMQ,以及它们在可用性、开发语言、协议支持、消息存储、事务处理和负载均衡等方面的特点。 首先,...

    大数据组件Kafka讲解.pdf

    同时,Kafka相比于RabbitMQ、ZeroMQ、ActiveMQ和Redis等其他消息队列(MQ),它在处理大规模数据流方面有其独特的优势。 总的来说,Kafka的核心特点在于它能够提供非常高的吞吐量,消息持久化,便于水平扩展,以及...

    rabbitMQ文档

    1. **ActiveMQ**:Apache ActiveMQ 是一个完全支持JMS 1.1和J2EE 1.4规范的、功能全面的消息代理服务,提供多种消息传递模式。 2. **RabbitMQ**:RabbitMQ 是基于AMQP标准的一个消息中间件,具有高可用性和扩展性,...

    rabbitmq教程

    目前市场上较为流行的消息队列框架包括RabbitMQ、ActiveMQ、ZeroMQ、Kafka以及阿里巴巴开源的RocketMQ等。本教程将重点介绍RabbitMQ及其使用方法。 #### RabbitMQ简介 RabbitMQ是一个开源的消息代理软件,基于...

    十种MQ的技术选型详细对比.docx

    在本文档中,我们将对以下十种消息队列(Message Queue,简称MQ)系统进行详细的技术选型对比:ActiveMQ、RabbitMQ、RocketMQ、Joram、HornetQ、OpenMQ、MuleMQ、SonicMQ、ZeroMQ以及Kafka。这些系统在企业级应用中...

Global site tag (gtag.js) - Google Analytics