RocketMQ原理解析
RocketMQ是阿里巴巴开源的分布式是消息中间件, 具有以下特点:
能够保证严格的消息顺序
提供丰富的消息拉取模式
高效的订阅者水平扩展能力
实时的消息订阅机制
亿级消息堆积能力
斩秋
hello world!
展开
-
RocketMQ原理解析-Remoting3.通信层整体交互图
原创 2014-09-09 11:24:39 · 5602 阅读 · 2 评论 -
RocketMQ原理解析-Remoting2. 通信层底层传输协议
RocketMq服务器与客户端通过传递RemotingCommand来交互,通过NettyDecoder,NettyEncoder对RemotingCommand进行协议的编码与解码 协议格式 1 2 3 4协议分4部分,含义分别如下1、大端4个字节整数,等于2、3、4长度总和2、大端原创 2014-09-09 11:22:45 · 5565 阅读 · 0 评论 -
RocketMQ原理解析-namesrv
Namesrv名称服务,是没有状态可集群横向扩展。1. 每个broker启动的时候会向namesrv注册2. Producer发送消息的时候根据topic获取路由到broker的信息3. Consumer根据topic到namesrv获取topic的路由到broker的信息 一:Namesrv功能: 接收broker的请求注册b原创 2014-09-09 10:45:56 · 7243 阅读 · 0 评论 -
RocketMQ原理解析-broker 6.索引服务
索引结构IndexFile 存储具体消息索引的文件,文件的内容结构如图:原创 2014-09-09 10:36:17 · 7768 阅读 · 1 评论 -
RocketMQ原理解析-broker 4.HA & master slave
在broker启动的时候BrokerController如果是slave,配置了master地址更新,没有配置所有broker会想namesrv注册,从namesrv获取haServerAddr,然后更新到HAClient 当HAClient的MasterAddress不为空的时候(因为broker master和slave都构建了HAClient)会主动连接master获取Socket原创 2014-09-09 00:44:04 · 10204 阅读 · 3 评论 -
RocketMQ原理解析-broker 3.load&recover
Broker启动的时候需要加载一系列的配置,启动一系列的任务,主要分布在BrokerController 的initialize()和start()方法中1. 加载topic配置2. 加载消费进度consumer offset 3. 加载消费者订阅关系consumer subscription4. 加载本地消息messageStore.loa原创 2014-09-09 00:44:08 · 4661 阅读 · 0 评论 -
RocketMQ原理解析-broker 2.消息存储
Rocketmq的消息的存储是由consume queue和 commitLog 配合完成的1) consume queue 消息的逻辑队列,相当于字典的目录用来指定消息在消息的真正的物理文件commitLog上的位置,每个topic下的每个queue都有一个对应的consumequeue文件。文件地址:${user.home} \store\consumequeue\${topic原创 2014-09-09 00:34:34 · 11511 阅读 · 1 评论 -
RocketMQ原理解析-broker 1. broker的启动
brker的启动Broker向namesrv注册1. 获取namesrv的地址列表(是乱序的)2. 遍历向每个namesrv注册topic的配置信息topicconfigTopic在broker文件上的存储json格式"TopicTest":{ "perm":6,原创 2014-09-09 00:33:47 · 10137 阅读 · 1 评论 -
RocketMQ原理解析-consumer 7.shutdown
DefaultMQPushConsumerImpl 关闭消费端 关闭消费线程 将分配到的Set的消费进度保存到broker利用DefaultMQPushConsumerImpl获取ProcessQueueTable的keyset的messagequeue去获取RemoteBrokerOffsetStore.offsetTableMap中的消费进度,原创 2014-09-09 00:31:39 · 4738 阅读 · 0 评论 -
RocketMQ原理解析-consumer 6.pull消息消费
消费者主动拉取消息消费,客户端通过类DefaultMQPullConsumer 客户端可以指定特定MessageQueue 也可以通过DefaultMQPullConsumer.fetchMessageQueuesInBalance(topic) 获取消费的队列 业务自己获取消费队列,自己到broker拉取消息,以及自己更新消费进度因原创 2014-09-09 00:29:43 · 7567 阅读 · 1 评论 -
RocketMQ原理解析-consumer 5.push消费-顺序消费消息
顺序消费服务ConsumeMessageConcurrentlyService构建的时候 构建一个线程池来接收消费请求ConsumeRequest 构建一个单线程的本地线程,用来稍后定时重新消费ConsumeRequest, 用来执行定时周期性(一秒)钟锁队列任务 周期性锁队列lockMQPe原创 2014-09-09 00:26:42 · 8555 阅读 · 2 评论 -
RocketMQ原理解析-consumer 4.长轮询push消息—并发消费消息
通过长轮询拉取到消息后会提交到消息服务ConsumeMessageConcurrentlyService,ConsumeMessageConcurrentlyServic的submitConsumeRequest方法构建ConsumeRequest任务提交到线程池。长轮询向broker拉取消息是批量拉取的, 默认设置批量的值为pullBatchSize= 32,可配置消费端cons原创 2014-09-09 00:23:57 · 11684 阅读 · 6 评论 -
RocketMQ原理解析-consumer 3.长轮询
Rocketmq的消息是由consumer端主动到broker拉取的, consumer向broker发送拉消息请求, PullMessageService服务通过一个线程将阻塞队列LinkedBlockingQueue中的PullRequest到broker拉取消息 DefaultMQPushConsumerImpl的pullMessage(pullRequest)方法执行向原创 2014-09-09 00:07:43 · 6889 阅读 · 2 评论 -
RocketMQ原理解析-consumer 2.消费端负载均衡
消费端负载均衡原创 2014-09-09 00:08:10 · 9443 阅读 · 3 评论 -
RocketMQ原理解析-consumer 1.启动
有别于其他消息中间件由broker做负载均衡并主动向consumer投递消息,RocketMq是基于拉模式拉取消息,consumer做负载均衡并通过长轮询向broker拉消息。 Consumer消费拉取的消息的方式有两种1. Push方式:rocketmq已经提供了很全面的实现,consumer通过长轮询拉取消息后回调MessageListener接口实现完成消费,应用系统只原创 2014-09-09 00:00:04 · 5886 阅读 · 0 评论 -
RocketMQ原理解析-producer 6.消息在broker落地之事物消息
消息落地commitLog针对事物消息的处理,消息的第20位开始的八位记录是的消息在逻辑队列中的queueoffset,但是针对事物消息为preparedType和rollbackType的存储的是事物状态表的索引偏移量分发事物消息: 分发消息位置信息到ConsumeQueue: 事物状态为preparedType和rollbackType的消息不会将请原创 2014-09-08 23:57:03 · 3480 阅读 · 1 评论 -
RocketMQ原理解析-producer 5.消息在broker落地之普通消息
Broker根据producer请求的RequestCode.SEND_MESSAGE选择对应的处理器SendMessageProcessor 根据请求消息内容构建消息内部结构MessageExtBrokerInner 调DefaultMessageStore加消息写入commitlog原创 2014-09-08 23:54:43 · 4058 阅读 · 3 评论 -
RocketMQ原理解析-producer 4.发送分布式事物消息
先引入官方文档图:原创 2014-09-08 23:50:14 · 6042 阅读 · 2 评论 -
RocketMQ原理解析-producer 3.如何发送顺序消息
Rocketmq能够保证消息严格顺序,但是Rocketmq需要producer保证顺序消息按顺序发送到同一个queue中,比如购买流程(1)下单(2)支付(3)支付成功,这三个消息需要根据特定规则将这个三个消息按顺序发送到一个queue 如何实现把顺序消息发送到同一个queue: 一般消息是通过轮询所有队列发送的,顺序消息可以根据业务比如说订单号orderId相同的原创 2014-09-08 23:44:54 · 6402 阅读 · 2 评论 -
RocketMQ原理解析-producer 2.如何发送消息
Producer轮询某topic下的所有队列的方式来实现发送方的负载均衡1) Topic下的所有队列如何理解:比如broker1, broker2, borker3三台broker机器都配置了Topic_ABroker1 的队列为queue0 , queue1Broker2 的队列为queue0, queue2, queue3,Broker3 的队列为queue0当然原创 2014-09-08 23:37:04 · 7783 阅读 · 5 评论 -
RocketMQ原理解析-producer 1.启动流程
Producer启动流程 Producer如何感知要发送消息的broker即brokerAddrTable中的值是怎么获得的, 1. 发送消息的时候指定会指定topic,如果producer集合中没有会根据指定topic到namesrv获取topic发布信息TopicPublishInfo,并放入本地集合2. 定时从namesrv更新topic路由信息,原创 2014-09-08 23:21:34 · 9422 阅读 · 4 评论