RocketMQ
文章平均质量分 57
Amazing的fighting
这个作者很懒,什么都没留下…
展开
-
RocketMQ原理解析-producer 2.如何发送消息
Producer轮询某topic下的所有队列的方式来实现发送方的负载均衡1) Topic下的所有队列如何理解:比如broker1, broker2, borker3三台broker机器都配置了Topic_ABroker1 的队列为queue0 , queue1Broker2 的队列为queue0, queue2, queue3,Broker3 的队列为qu转载 2017-07-13 15:29:18 · 224 阅读 · 0 评论 -
RocketMQ原理解析-broker 3.load&recover
Broker启动的时候需要加载一系列的配置,启动一系列的任务,主要分布在BrokerController 的initialize()和start()方法中1. 加载topic配置2. 加载消费进度consumer offset 3. 加载消费者订阅关系consumer subscription4. 加载本地消息messageStore.loa原创 2017-07-18 17:53:08 · 266 阅读 · 0 评论 -
RocketMQ原理解析-broker 2.消息存储
Rocketmq的消息的存储是由consume queue和 commitLog 配合完成的1) consume queue 消息的逻辑队列,相当于字典的目录用来指定消息在消息的真正的物理文件commitLog上的位置,每个topic下的每个queue都有一个对应的consumequeue文件。文件地址:${user.home} \store\consumequeue\${topic原创 2017-07-13 15:47:38 · 232 阅读 · 0 评论 -
RocketMQ原理解析-broker 1. broker的启动
brker的启动Broker向namesrv注册1. 获取namesrv的地址列表(是乱序的)2. 遍历向每个namesrv注册topic的配置信息topicconfigTopic在broker文件上的存储json格式"TopicTest":{ "perm":6,原创 2017-07-13 15:46:51 · 392 阅读 · 0 评论 -
RocketMQ配置
1. 客户端的公共配置类:ClientConfig参数名默认值说明namesrvAddrNameServer地址列表,多个NameServer地址用分号隔开clientIp本机IP客户端本机IP地址,某些机器会发送无法识别客户端IP地址的情况,需要应用在代码中强制指定instanceNameDEFAULT客原创 2017-07-14 11:04:08 · 3175 阅读 · 0 评论 -
分布式消息队列RocketMQ--事务消息--解决分布式事务的最佳实践
说到分布式事务,就会谈到那个经典的”账号转账”问题:2个账号,分布处于2个不同的DB,或者说2个不同的子系统里面,A要扣钱,B要加钱,如何保证原子性?一般的思路都是通过消息中间件来实现“最终一致性”:A系统扣钱,然后发条消息给中间件,B系统接收此消息,进行加钱。但这里面有个问题:A是先update DB,后发送消息呢? 还是先发送消息,后update DB?假设先update DB成功原创 2017-07-14 09:12:58 · 791 阅读 · 1 评论 -
分布式消息队列RocketMQ与Kafka的18项差异之“拨乱反正“之2
在前1篇,我讨论了RocketMQ与Kakfa的对比中,几个不太严谨的地方。本着严谨的精神,不偏袒任何一方,本篇想分析一下RocketMQ在Kafka的基础上,的确做的几个改进。有不对之处,敬请指正。topic/partion数量对性能的影响我们知道在Kafka中,是每个topic_partition一个文件。虽然每个文件是顺序IO,但topic或者partition过多,每个文件的顺序I原创 2017-07-14 09:11:57 · 327 阅读 · 0 评论 -
分布式消息队列RocketMQ与Kafka的18项差异之“拨乱反正”
我们知道,阿里的RocketMQ其实源自Kafka。同时网络上一直流传着1篇阿里中间件团队所写的RocketMQ与Kafka的18项差异的文章,并且被广泛转发。比如:http://blog.csdn.net/damacheng/article/details/42846549https://yq.aliyun.com/articles/25389作为对Kafka有一点研究的爱好者,原创 2017-07-14 09:11:20 · 560 阅读 · 0 评论 -
RocketMQ原理解析-consumer 2.消费端负载均衡
消费端负载均衡消费端会通过RebalanceService线程,10秒钟做一次基于topic下的所有队列负载 消费端遍历自己的所有topic,依次调rebalanceByTopic 根据topic获取此topic下的所有queue 选择一台broker获取基于group的所有消费端(有心跳向所有broker注册客户端信息) 选择队列分配策略实例Alloc转载 2017-07-19 09:05:23 · 301 阅读 · 0 评论 -
RocketMQ原理解析-consumer 3.长轮询
Rocketmq的消息是由consumer端主动到broker拉取的, consumer向broker发送拉消息请求, PullMessageService服务通过一个线程将阻塞队列LinkedBlockingQueue中的PullRequest到broker拉取消息 DefaultMQPushConsumerImpl的pullMessage(pullRequest)方法执行向转载 2017-07-13 15:40:23 · 700 阅读 · 0 评论 -
RocketMQ原理解析-consumer 4.长轮询push消息—并发消费消息
通过长轮询拉取到消息后会提交到消息服务ConsumeMessageConcurrentlyService,ConsumeMessageConcurrentlyServic的submitConsumeRequest方法构建ConsumeRequest任务提交到线程池。长轮询向broker拉取消息是批量拉取的, 默认设置批量的值为pullBatchSize= 32,可配置消费端consum转载 2017-07-19 09:06:15 · 639 阅读 · 0 评论 -
分布式消息队列RocketMQ源码分析之1 -- Topic路由数据结构解析 -- topicRoute与topicPublishInfo与queueId
在前1篇RokcetMQ与Kafka架构差异一文中,我们已经讨论了2者在Topic的路由结构,也即topic/partition与物理机器的映射关系上的巨大差异。这个差异也是2者在架构上的一个巨大差异点,也是导致RocketMQ可以去除ZK依赖的一个重要原因。本篇将接着这个话题,进一步从源码角度深度解析Topic的路由数据结构。至所以把“topic路由结构“作为源码分析的首篇,是因为这个话题串原创 2017-07-14 09:00:38 · 525 阅读 · 0 评论 -
分布式消息队列Kafka & RocketMQ 深度学习资料精选
http://blog.csdn.net/a417930422/article/category/6086259http://blog.csdn.net/lizhitaohttp://www.cnblogs.com/huxi2bhttp://blog.csdn.net/u014393917/article/category/6332828阿里中间件团队博客 http://jm.原创 2017-07-14 08:58:14 · 439 阅读 · 0 评论 -
RocketMQ原理解析-consumer 5.push消费-顺序消费消息
顺序消费服务ConsumeMessageConcurrentlyService构建的时候 构建一个线程池来接收消费请求ConsumeRequest 构建一个单线程的本地线程,用来稍后定时重新消费ConsumeRequest, 用来执行定时周期性(一秒)钟锁队列任务 周期性锁队列lockMQPe转载 2017-07-13 15:42:24 · 278 阅读 · 0 评论 -
RocketMQ原理解析-consumer 6.pull消息消费
消费者主动拉取消息消费,客户端通过类DefaultMQPullConsumer 客户端可以指定特定MessageQueue 也可以通过DefaultMQPullConsumer.fetchMessageQueuesInBalance(topic) 获取消费的队列 业务自己获取消费队列,自己到broker拉取消息,以及自己更新消费进度因转载 2017-07-19 09:07:58 · 673 阅读 · 0 评论 -
RocketMQ原理解析-consumer 7.shutdown
DefaultMQPushConsumerImpl 关闭消费端 关闭消费线程 将分配到的Set的消费进度保存到broker利用DefaultMQPushConsumerImpl获取ProcessQueueTable的keyset的messagequeue去获取RemoteBrokerOffsetStore.offsetTableMap中的消费进度,转载 2017-07-13 15:45:25 · 580 阅读 · 0 评论 -
RocketMQ原理解析-broker 6.索引服务
1索引结构IndexFile 存储具体消息索引的文件,文件的内容结构如图:索引文件由索引文件头IndexHeader, 槽位Slot和消息的索引内容三部分构成 IndexHeader:索引文件头信息40个字节的数据组成 beginTimestamp 8位long类型,索引文件构建第一个索引的消息落在broker的时间endTimestamp原创 2017-07-13 15:51:44 · 196 阅读 · 0 评论 -
RocketMQ原理解析-broker 4.HA & master slave
在broker启动的时候BrokerController如果是slave,配置了master地址更新,没有配置所有broker会想namesrv注册,从namesrv获取haServerAddr,然后更新到HAClient 当HAClient的MasterAddress不为空的时候(因为broker master和slave都构建了HAClient)会主动连接master获取Socket原创 2017-07-13 15:50:14 · 478 阅读 · 0 评论 -
分布式消息队列RocketMQ之Netty -- 1+N+M1+M2模型
我们知道Kafka的network层是直接基于JavaNIO写的,在前面Kafka源码分析序列中已经有详细分析。 RocketMQ的network层是基于Netty写的,实现起来相对简单一些,毕竟Netty已经是很成熟的网络框架。本篇就来分析一下,直接使用javaNIO写网络层,和基于Netty写,模型上有什么区别。1我们知道,Java NIO的1+N+M模型:1个accept原创 2017-07-14 09:10:09 · 869 阅读 · 0 评论 -
RocketMQ原理解析-producer 3.如何发送顺序消息
Rocketmq能够保证消息严格顺序,但是Rocketmq需要producer保证顺序消息按顺序发送到同一个queue中,比如购买流程(1)下单(2)支付(3)支付成功,这三个消息需要根据特定规则将这个三个消息按顺序发送到一个queue 如何实现把顺序消息发送到同一个queue: 一般消息是通过轮询所有队列发送的,顺序消息可以根据业务比如说订单号orderId相同的转载 2017-07-13 15:31:19 · 323 阅读 · 0 评论 -
RocketMQ原理解析-producer 5.消息在broker落地之普通消息
Broker根据producer请求的RequestCode.SEND_MESSAGE选择对应的处理器SendMessageProcessor 根据请求消息内容构建消息内部结构MessageExtBrokerInner 调DefaultMessageStore加消息写入commitlog转载 2017-07-13 15:34:22 · 260 阅读 · 0 评论 -
RocketMQ原理解析-producer 1.启动流程
Producer如何感知要发送消息的broker即brokerAddrTable中的值是怎么获得的,1. 发送消息的时候指定会指定topic,如果producer集合中没有会根据指定topic到namesrv获取topic发布信息TopicPublishInfo,并放入本地集合2. 定时从namesrv更新topic路由信息, Producer与broker间的转载 2017-07-13 15:27:27 · 312 阅读 · 0 评论 -
RocketMQ原理解析-producer 4.发送分布式事物消息
先引入官方文档图:分布式事物是基于二阶段提交的1) 一阶段,向broker发送一条prepared的消息,返回消息的offset即消息地址commitLog中消息偏移量。Prepared状态消息不被消费发送消息ok,执行本地事物分支, 本地事物方法需要实现rocketmq的回调接口2)2)2) LocalTransactionExecuter,处理本地事物原创 2017-07-13 15:32:54 · 292 阅读 · 0 评论 -
RocketMQ原理解析-namesrv
Namesrv名称服务,是没有状态可集群横向扩展。1. 每个broker启动的时候会向namesrv注册2. Producer发送消息的时候根据topic获取路由到broker的信息3. Consumer根据topic到namesrv获取topic的路由到broker的信息 一:Namesrv功能: 接收broker的请求注册b原创 2017-07-13 15:53:30 · 186 阅读 · 0 评论 -
RocketMQ原理解析-producer 6.消息在broker落地之事物消息
1. 消息落地commitLog针对事物消息的处理,消息的第20位开始的八位记录是的消息在逻辑队列中的queueoffset,但是针对事物消息为preparedType和rollbackType的存储的是事物状态表的索引偏移量2. 分发事物消息: 分发消息位置信息到ConsumeQueue: 事物状态为preparedType和rollbackType的原创 2017-07-13 15:36:20 · 400 阅读 · 0 评论 -
分布式开放消息系统(RocketMQ)的原理与实践
分布式消息系统作为实现分布式系统可扩展、可伸缩性的关键组件,需要具有高吞吐量、高可用等特点。而谈到消息系统的设计,就回避不了两个问题:消息的顺序问题消息的重复问题RocketMQ作为阿里开源的一款高性能、高吞吐量的消息中间件,它是怎样来解决这两个问题的?RocketMQ 有哪些关键特性?其实现原理是怎样的?关键特性以及其实现原理一、顺序消息消息有序指的是可以按照原创 2017-07-13 09:10:38 · 395 阅读 · 0 评论 -
RocketMQ原理解析-consumer 1.启动
有别于其他消息中间件由broker做负载均衡并主动向consumer投递消息,RocketMq是基于拉模式拉取消息,consumer做负载均衡并通过长轮询向broker拉消息。 Consumer消费拉取的消息的方式有两种1. Push方式:rocketmq已经提供了很全面的实现,consumer通过长轮询拉取消息后回调MessageListener接口实现完成消费,应用系统只转载 2017-07-13 15:37:44 · 209 阅读 · 0 评论 -
RocketMQ原理解析-Remoting2. 通信层底层传输协议
RocketMq服务器与客户端通过传递RemotingCommand来交互,通过NettyDecoder,对RemotingCommand进行协议的编码与解码 协议格式 1 2 3 4协议分4部分,含义分别如下1、大端4个字节整数,等于2、3、4长度总和2、大端4个字节整数,等于3的长原创 2017-07-20 09:53:20 · 329 阅读 · 0 评论 -
RocketMQ原理解析-Remoting3.通信层整体交互图
原创 2017-07-20 09:53:38 · 283 阅读 · 0 评论 -
分布式消息队列RocketMQ源码分析之2 -- Broker与NameServer心跳机制
我们知道,Kafka是通过ZK的临时节点来监测Broker的死亡的。当一个Broker挂了之后,ZK上面对应的临时节点被删除,同时其他Broker收到通知。那么在RocketMQ中,对应的NameServer是如何判断一个Broker的死亡呢?NameSrv监测Broker的死亡机制之一:监测连接断掉当Broker和NameSrv之间的长连接断掉之后,下面的ChannelEvent原创 2017-07-14 09:02:30 · 582 阅读 · 0 评论 -
分布式消息队列RocketMQ与Kafka架构上的巨大差异之1 -- 为什么RocketMQ要去除ZK依赖?
我们知道,在早期的RocketMQ版本中,是有依赖ZK的。而现在的版本中,是去掉了对ZK的依赖,转而使用自己开发的NameSrv。并且这个NameSrv是无状态的,你可以随意的部署多台,其代码也非常简单,非常轻量。那不禁要问了:ZooKeeper是业界用来管理集群的一个非常常用的中间件,比如Kafka就是依赖的ZK。那为什么RocketMQ要自己造轮子,自己做集群的管理呢?纯粹就是再做一个原创 2017-07-14 09:03:43 · 1936 阅读 · 0 评论 -
分布式消息队列RocketMQ与Kafka架构上的巨大差异之2 -- CommitLog与ConsumeQueue
在前面Rocket与Kafka的对比之“拨乱反正”续篇中,我们已经提到了RocketMQ和Kafka在架构上面的一个巨大差异:Kafka是每个partition对应一个文件,而RocketMQ是把所有topic的所有queue的消息存储在一个文件里面,然后再分发给ConsumeQueue。存储上的巨大差异Kafka的存储下图展示了Kafka的存储结构: 其中每个topic_partit原创 2017-07-14 09:05:03 · 1953 阅读 · 1 评论 -
分布式消息队列RocketMQ源码分析之3 -- Consumer负载均衡机制 -- Rebalance
同Kafka一样,RocketMQ也需要探讨一个问题:如何把一个topic的多个queue分摊给不同的consumer,也就是负载均衡问题。在讨论这个问题之前,我们先看一下Client的整体架构。Producer与Consumer类体系从下图可以看出以下几点: (1)Producer与Consumer的共同逻辑,封装在MQClientInstance,MQClientAPIImpl原创 2017-07-14 09:06:02 · 234 阅读 · 0 评论 -
分布式消息队列RocketMQ源码分析之4 -- Consumer负载均衡与Kafka的Consumer负载均衡之不同点
在上1篇里,我们主要从使用层面介绍了Consumer的负载均衡机制。这一篇,我们将深入到源码内部,深入分析负载均衡的过程。如果把RocketMQ的负载均衡和Kafka的对比一下,我们会发现有一些重要的不同之处。Kafka的负载均衡,参见: http://blog.csdn.net/chunlongyu/article/details/52791874收集信息 – 存储在Broker还是原创 2017-07-14 09:07:11 · 337 阅读 · 0 评论 -
分布式消息队列RocketMQ&Kafka -- 消息的“顺序消费”-- 一个看似简单的复杂问题
在说到消息中间件的时候,我们通常都会谈到一个特性:消息的顺序消费问题。这个问题看起来很简单:Producer发送消息1, 2, 3。。。 Consumer按1, 2, 3。。。顺序消费。但实际情况却是:无论RocketMQ,还是Kafka,缺省都不保证消息的严格有序消费!这个特性看起来很简单,但为什么缺省他们都不保证呢?“严格的顺序消费”有多么困难下面就从3个方面来分析一下,对于一原创 2017-07-14 09:08:34 · 310 阅读 · 0 评论 -
RocketMQ原理解析-Remoting1. 通信层实现
Rocketmq的通信层是基于通信框架netty 4.0.21.Final之上做了简单的协议封装,是强依赖。一: NettyRemotingAbstract Server与Client公用抽象类ResponseFuture模式: invokeSyncImpl和invokeAsyncImpl都使用了 请求方会new一个ResponseFutur原创 2017-07-13 15:54:17 · 287 阅读 · 0 评论