1Rocket介绍:发展历史大约经历了三个主要版本迭代一、Metaq1.x:开源社区killme2008维护,开源社区非常活跃二、Metaq2.x:于2012年10月份在淘宝内部上线,并广泛使用三、RocketMq3.x:阿里内部对其核心功能的简化。并衍生出多个消息服务项目。运用到阿里的支付、订单、充值等多个业务领域。MQ对比ActiveMQRabbitMQRocketMQ关注度高高中成熟度成熟成熟比较成熟社区ApacheMozilla开源社区Alibaba社区活跃度高高中文档多多少特点功能齐全,被大量使用由于Erlang语言的并发能力,使得性能很好各个环节分布式扩展设计,主从高可用群集;支持上万个队列;多种消费模式;性能很好开源开源开源开源语言JavaErlang(面向并发编程语言)JavaClient语言支持Java支持Java支持Java支持协议OpenWire、STOMP、REST、XMPP、AMQPAMQP自定义的一套,提供了支持JMS客户端的API持久化内存,文件,数据库内存,文件磁盘文件事务支持不支持支持集群和负载均衡支持支持支持管理页面一般好无部署方式独立,嵌入独立独立评价优点:成熟的产品,已经在很多公司得到应用(非大规模场景)。有较多的文档。各种协议支持较好,有多重语言的成熟的客户优点:由于erlang语言的特性,mq性能较好;管理界面较丰富,在互联网公司也有较大规模的应用;优点:模型简单,接口易用。在阿里大规模应用。目前支付宝中的余额宝等新兴产品均使用rocketmq。集群规模大概在50台左右,单日处理消息上百亿;性能非常好,可以大量堆积消2端;缺点:根据其他用户反馈,会出莫名其妙的问题,并且会丢消息。其重心放到activemq6.0产品—apollo上去了,目前社区不活跃,且对5.x维护较少;Activemq不适合用于上千个队列的应用场景支持amqp协议,有多中语言且支持amqp的客户端可用。缺点:erlang语言难度较大。息在broker中;支持多种消费,包括集群消费、广播消费等。开发度较活跃,版本更新很快。缺点:产品较新,文档比较缺乏。没有在mq核心中去实现JMS等接口,对已有系统而言不能兼容。RocketMQ与Kafka对比Kafka无限消息堆积,高效的持久化速度,主要用于日志传输。RocketMQ广泛应用订单、交易、充值、消息推送、日志传输场景。RocketMQKafka数据可靠性支持异步实时刷盘,同步刷盘,同步主从复制和异步主从复制异步刷盘方式和异步主从复制总结总结:RocketMQ的同步刷盘在单机可靠性上比Kafka更高,不会因为操作系统崩溃,导致数据丢失。同时同步Replication也比Kafka异步Replication更可靠,数据完全无单点。另外Kafka的Replication以topic为单位,支持主机宕机,备机自动切换,但是这里有个问题,由于是异步Replication,那么切换后会有数据丢失,同时宕机的机器如果重启后,会与已经存在的主机器产生数据冲突(?)。开源版本的RocketMQ不支持Master宕机,Slave自动切换为Master,阿里云版本的RocketMQ支持自动切换特性性能RocketMQ单机写入TPS单实例约7万条/秒,单机部署3个Broker,可以跑到最高12万条/秒,消息大小10个字节Kafka单机写入TPS约在百万条/秒,消息大小10个字节总结Kafka的TPS跑到单机百万,主要是由于生产者端将多个小消息合并,批量发向Broker。RocketMQ为什么没有这么做?生产者通常使用Java语言,缓存过多消息,GC是个很严重的问题生产者调用发送消息接口,消息未发送到Broker,向业务返回成功,此时生产者宕机,会导致消息丢失,业务出错生产者通常为分布式系统,且每台机器都是多线程发送,我们认为线上的系统单个生产者每秒产生的数据量有限,不可能上万。缓存的功能完全可以由上层业务完成。单机支持队列数RocketMQ单机支持最高5万个队列,Load不会发生明显变化Kafka单机超过64个队列/分区,Load会发生明显的飙高现象,队列越多,load越高,发送消息响应3时间变长消息投递实时性RocketMQ使用长轮询,同Push方式实时性一致,消息的投递延时通常在几个毫秒。Kafka使用短轮询方式,实时性取决于轮询间隔时间消息失败重试RocketMQ消费失败支持定时重试,每次重试间隔时间顺延Kafka消费失败不支持重试总结例如充值类应用,当前时刻调用运营商网关,充值失败,可能是对方压力过多,稍后在调用就会成功,如支付宝到银行扣款也是类似需求。这里的重试需要可靠的重试,即失败重试的消息不因为Consumer宕机导致丢失严格的消息顺序RocketMQ支持严格的消息顺序,在顺序消息场景下,一台Broker宕机后,发送消息会失败,但是不会乱序Kafka支持消息顺序,但是一台Broker宕机后,就会产生消息乱序定时消息RocketMQ支持两类定时消息开源版本RocketMQ仅支持定时Level阿里云ONS支持定时Level,以及指定的毫秒级别的延时时间Kafka不支持定时消息分布式事务消息支持分布式事务消息Kafka不支持分布式事务消息消息查询RocketMQ支持根据MessageId查询消息,也支持根据消息内容查询消息(发送消息时指定一个MessageKey,任意字符串,例如指定为订单Id)Kafka不支持消息查询总结消息查询对于定位消息丢失问题非常有帮助,例如某个订单处理失败,是消息没收到还是收到处理出错了。消息回溯RocketMQ支持按照时间来回溯消息,精度毫秒,例如从一天之前的某时某分某秒开始重新消费消息Kafka理论上可以按照Offset来回溯消息总结典型业务场景如consumer做订单分析,但是由于程序逻辑或者依赖的系统发生故障等原因,导致今天消费的消息全部无效,需要重新从昨天零点开始消费,那么以时间为起点的消息重放功能对于业务非常有帮助。消息并行度RocketMQ消费并行度分两种情况1.顺序消费方式并行度同Kafka完全一致2.乱序方式并行度取决于Consumer的线程数,如Topic配置10个队列,10台机器消费,每台机器100个线程,那么并行度为1000。Kafka的消费并行度依赖Topic配置的分区数,如分区数为10,那么最多10台机器来并行消费(每台机器只能开启一个线程),或者一台机器消费(10个线程并行消费)。即消费并行度和分区数一致。Broker端消息过滤RocketMQ支持两种Broker端消息过滤方式1.根据MessageTag来过滤,相当Kafka不支持Broker端的消息过滤4于子topic概念2.向服务器上传一段Java代码,可以对消息做任意形式的过滤,甚至可以做MessageBody的过滤拆分。消息堆积能力理论上Kafka要比RocketMQ的堆积能力更强,不过RocketMQ单机也可以支持亿级的消息堆积能力,我们认为这个堆积能力已经完全可以满足业务需求成熟度RocketMQ在阿里集团内部有大量的应用在使用,每天都产生海量的消息,并且顺利支持了多次天猫双十一海量消息考验,是数据削峰填谷的利器。Kafka在日志领域比较成熟。特性1、支持严格的消息顺序;2、支持Topic与Queue两种模式;3、亿级消息堆积能力;4、比较友好的分布式特性;5、同时支持Push与Pull方式消费消息;Topic发布订阅模式topic数据默认不落地,是无状态的。并不保证publisher发布的每条数据,Subscriber都能接受到。一般来说publisher发布消息到某一个topic时,只有正在监听该topic地址的sub能够接收到消息;如果没有sub在监听,该topic就丢失了。一对多的消息发布接收策略,监听同一个topic地址的多个sub都能收到publisher发送的消息。Sub接收完通知mq服务器。Queue点对点模式Queue数据默认会在mq服务器上以文件形式保存,也可以配置成DB存储。Queue保证每条数据都能被receiver接收。Sender发送消息到目标Queue,receiver可以异步接收这个Queue上的消息。Queue上的消息如果暂时没有receiver来取,也不会丢失。一对一的消息发布接收策略,一个sender发送的消息,只能有一个receiver接收。receiver接收完后,通知mq服务器已接收,mq服务器对queue里的消息采取删除或其他操作。Push推送类似于BrokerPush消息到Consumer方式,但实际仍然是Consumer内部后台从BrokerPull消息采用长轮询方式拉消息,实时性同push方式一致,且不会无谓的拉消息导致Broker、Consumer压力增大Pull拉取短轮询方式,可以设定轮询时间间隔5版本3.2.6部署图RocketMq主要包含三个服务:nameserver、broker、filterserverNameserver负责维护broker列表和路由功能。Broker负责消息的读取和存储Filterserver负责过滤查询1.nameserver:稳定性非常高。因为nameserver相互独立,彼此没有通信关系,单台nameserver挂掉,不影响其他nameserver,即使全部挂掉,也不影响业务系统使用,这点类似于dubbo的zookeeper。nameserver不会有频繁的读写,所以性能开销非常小,稳定性很高。2.broker1)与nameserver关系连接:单个broker和所有nameserver保持长连接心跳:心跳间隔:每隔30秒(此时间无法更改)向所有nameserver发送心跳,心跳包含了自身的topic配置信息。心跳超时:nameserver每隔10秒钟(此时间无法更改),扫描所有还存活的broker连接,若某个连接2分钟内(当前时间与最后更新时间差值超过2分钟,此时间无法更改)没有发送心跳数据,则断开连接。断开:6时机:broker挂掉;心跳超时导致nameserver主动关闭连接动作:一旦连接断开,nameserver会立即感知,更新topc与队列的对应关系,但不会通知生产者和消费者2)负载均衡一个topic分布在多个broker上,一个broker可以配置多个topic,它们是多对多的关系。如果某个topic消息量很大,应该给它多配置几个队列,并且尽量多分布在不同broker上,减轻某个broker的压力。topic消息量都比较均匀的情况下,如果某个broker上的队列越多,则该broker压力越大。3)可用性由于消息分布在各个broker上,一旦某个broker宕机,则该broker上的消息读写都会受到影响。所以rocketmq提供了master/slave的结构,salve定时从master同步数据,如果master宕机,则slave提供消费服务,但是不能写入消息,此过程对应用透明,由rocketmq内部解决。这里有两个关键点:一旦某个brokermaster宕机,生产者和消费者多久才能发现?受限于rocketmq的网络连接机制,默认情况下,最多需要30秒,但这个时间可由应用设定参数来缩短时间。这个时间段内,发往该broker的消息都是失败的,而且该broker的消息无法消费,因为此时消费者不知道该broker已经挂掉。消费者得到master宕机通知后,转向slave消费,但是slave不能保证master的消息100%都同步过来了,因此会有少量的消息丢失。但是消息最终不会丢的,一旦master恢复,未同步过去的消息会被消费掉。4)可靠性所有发往broker的消息,有同步刷盘和异步刷盘机制,总的来说,可靠性非常高同步刷盘时,消息写入物理文件才会返回成功,因此非常可靠异步刷盘时,只有机器宕机,才会产生消息丢失,broker挂掉可能会发生,但是机器宕机崩溃是很少发生的,除非突然断电5)消息清理扫描间隔:默认10秒,由broker配置参数cleanResour