`
y806839048
  • 浏览: 1088692 次
  • 性别: 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的比较

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

    主要介绍了浅谈Java消息队列总结篇(ActiveMQ、RabbitMQ、ZeroMQ、Kafka),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    RabbitMq实例以及安装包

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

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

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

    kafka的使用场景.docx

    目前使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ 二、消息队列应用场景 以下介绍消息队列在实际应用中常用的使用场景。异步处理,应用解耦,流量削锋和消息通讯四个场景。

    消息中间件之ActiveMQ视频课程

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

    MQ之ActiveMQ.mmap

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

    MQ选型之RabbitMQ

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

    rabbitmq学习资料

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

    ActiveMQ学习总结

    1.在网络通讯中,Http请求默认采用同步请求方式,基于请求与响应模式2....目前使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ实现方式:面向消息的中间件(MessageOrlentedMiddlewareMO

    MQ介绍与选型.docx

    文档中主要介绍RabbitMQ、ZeroMQ、ActiveMQ、Redis、Kafka、RocketMQ的不同使用场景,以及每种不同类型直接的区别对比;每种不同类型的对列之间的性能对比和建议使用场景。

    消息队列技术介绍

    目前在生产环境,使用较多的消息队列有ActiveMQ、RabbitMQ、ZeroMQ、Kafka、MetaMQ、RocketMQ等。 下面详细介绍一下消息队列在实际应用中常用的使用场景。场景分为异步处理、应用解耦、流量削锋和消息通讯四个场景。...

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

    ActiveMQ、RabbitMQ、RocketMq、Joram、HornetQ、OpenMQ、MuleMQ、SonicMQ、ZeroMQ、Kafka 从关注度,成熟度,社区活跃度、文档、特点、授权方式、语言、事务、集群、持久化、协议,部署方式、UI、评价等诸多维度

    RabbitMQ

    应用解耦、异步、流量削锋、数据分发、错峰流控、日志收集等等...MQ衡量标准服务性能、数据存储、集群架构主流竞品分析当前市面上mq的产品很多,比如RabbitMQ、Kafka、ActiveMQ、ZeroMQ和阿里巴巴捐献给Apache的...

    消息队列及消息中间件

    当前使用较多的消息队列有RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMQ 等,而部分数据库如Redis、MySQL以及phxsql也可实现消息队列的功能。消息队列是指利用高效可靠的消息传递机制进行与平台无关的数据...

    大型网站架构系列:消息队列

    目前在生产环境,使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ等。以下介绍消息队列在实际应用中常用的使用场景。异步处理,应用解耦,流量削锋和消息通讯四个场景。场景说明:用户...

    通俗易懂的消息中间件ActiveMQ教程(含配套资料)

    消息中间件已经成为互联网企业应用系统内部通信的核心...当前使用较多的消息中间件有RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMQ等,本次以Apache的ActiveMQ作为切入点,将带着同学们从零基础入门ActiveMQ。

Global site tag (gtag.js) - Google Analytics