RocketMQ原理及源码解析(汇总)

原文地址:

http://blog.youkuaiyun.com/a417930422/article/category/6423649

http://blog.youkuaiyun.com/xxxxxx91116/article/category/6022117

http://blog.youkuaiyun.com/a417930422/article/category/6086259

 

 

《RocketMq》五、Consumer消费者

Consumer-集群Push模式-简介: 0、背景介绍          Consumer主要用于向Broker请求Producer产生的消息,对其进行消费;对于RocketMQ,我们一定很好奇,如何实现分布式的Consumer消费,如何保证Consumer的顺序性,不重复性呢?   存在的问题: 1. 如果在集群模式中新增/减少 组(group) 消费者,可能会导致重复消费;原因是:...

2015-12-23 23:18 阅读(10355) 评论(0)

 

《RocketMq》四、Producer生产者

Producer的用途大家都很清楚,主要就是生产消息,那么分布式模式下与单队列模式不一样,如何能够充分利用分布式的优势,将生产的消息分布到不同的队列下呢?Rocket-MQ提供了3种不同模式的Producer: 1. NormalProducer 2. OrderProducer 3. TransactionProducer   一、数据结构 1. TopicPublicInfo:仅仅...

2015-12-22 12:53 阅读(4047) 评论(0)

 

《RocketMq》三、NameServer

RocketMQ-nameSrv用于管理所有broker的信息,以便于Producer和Consumer能够获取到正确的Broker信息,进行业务处理; 可以看到NameSrv的主要管理内容如下: 1. 接收Broker的注册,注销请求; 2. Producer获取topic下的所有BrokerQueue,put消息 3. Consumer获取topic下所有的BrokerQueue,ge...

2015-12-18 17:41 阅读(5155) 评论(1)

 

《RocketMq》二、存储篇

RocketMQ的数据存储部分也是一个重头戏,他主要用于存储Producer生产的消息,Consume的逻辑队列,索引,以及主从复制,这里也是一个非常好的范例,我们可以看到如何处理数据存储,如何提高IO效率。 东西太多信息量略大有点乱,之后再整理吧...... 一、总体结构 队列逻辑结构: 逻辑上来看,每一个Topic有很多queue,他们各自处于自己的ConsumeQue...

 

 

10.零拷贝原理

为何要懂零拷贝原理?因为rocketmq和存储核心使用的就是零拷贝原理。 io读写的方式 中断DMA 中断方式 中断方式的流程图如下: 用户进程发起数据读取请求系统调度为该进程分配cpucpu向io控制器(ide,scsi)发送io请求用户进程等待io完成,让出cpu系统调度cpu执行其他任务数据写入至io控制器的缓冲寄存器缓冲寄存器满了向cpu发出中断信号cpu...

2016-09-19 14:58 阅读(1235) 评论(1)

 

9.最佳实践

nameserver相关 nameserver如何扩容/下线? 由于broker,producer,consunmer都涉及到nameserver地址列表,故推荐如下方式配置: broker相关 broker如何下线? 先将slave kill掉, 防止kill master后consumer从slave消费如果直接kill master,会造成生产者和消费者...

2016-09-19 14:39 阅读(354) 评论(0)

 

8.consumer

消息的消费者,从消息获取方式分为: 推拉 - 推包含了拉,所以拉不再单独说明 推 com.alibaba.rocketmq.client.consumer.DefaultMQPushConsumer 从使用上来看,数据是broker端源源不断的将消息推到消费者从消息的消费方式上,分为: 集群消费:所有的消费者平均消费一份消息广播消费:每个消费者各自消费同一份消息  从消费的顺...

2016-09-19 14:32 阅读(564) 评论(3)

 

7.producer

消息生产者,消息的种类: 普通消息 import com.alibaba.rocketmq.client.exception.MQClientException; import com.alibaba.rocketmq.client.producer.DefaultMQProducer; import com.alibaba.rocketmq.client.produc...

2016-09-19 14:27 阅读(354) 评论(0)

 

6.broker

broker主要有以下几大功能 接受客户端发送到消息,并存储接受客户端的消费请求,返回消息数据consumergroup消费进度存储、查询topic配置管理一些其他的配置管理、查询:topic创建、删除、修改,broker配置查询、修改,消息查询,broker运行状态,producer、consumer连接,消费进度等待 broker额外存储的持久化数据,默认存储路径为$HOME/stor...

2016-09-19 14:23 阅读(317) 评论(0)

 

5.NameServer

NameServer作为rocketmq中重要的组件其主要有如下功能: 接受boker注册与解除注册获取broker集群信息根据topic查询其路由信息查询所有的topic删除topic查询某集群下的所有topic一些键值对设置,比如顺序消息相关设置 接受boker注册与解除注册 broker注册时会携带如下信息 集群的名字地址broker名字broker id: 0为mast...

2016-09-19 14:21 阅读(373) 评论(7)

 

4.通信层

概述 rocketmq通信层采用netty来实现,netty是nio socket的一个框架 nio vs io 区别 io nio nio优势 nio缺点 面向流 面向缓冲 面向缓冲区的编程方式 流式处理数据直观,优雅,nio不具备这些优点 阻塞 非阻塞 数据不可获取时不进行等待,节省...

2016-09-19 14:07 阅读(622) 评论(0)

 

3.存储层高可用

rocketmq的存储层是支持高可用的,通过将数据同步到其他地方的方式实现。那么,从broker的不同角色角度来看,如下图: 从broker的数据同步方式,又分为同步双写和异步复制,其逻辑图如下: 同步双写: 异步复制: 同步双写和异步复制的实现 虽然逻辑上看来两种方式是不一样的,但是在rocketmq中却是同一份代码实现的,甚至,连master和slave的代码...

2016-09-19 14:00 阅读(298) 评论(0)

 

2.存储层

commitlog 存储路径默认为$HOME/store/commitlog,可以在broker启动时通过storePathCommitLog设置,存储的文件如下图所示,默认大小为1G: 数据过来如何存储到这些文件里面呢? 消息需要加一些元数据 消息加元数据的结构如下: 序号 类型 值 释义 1 int TOTALS...

2016-09-19 13:57 阅读(671) 评论(0)

 

1.简介

rocketmq是什么 高可用,高性能,分布式有序队列 使用场景      如果业务系统遇到如下词语,可以使用rocketmq 系统解耦发布订阅分布式队列数据延时处理分布式事务非实时业务削峰 物理部署结构 name server 主要负责存储topic的路由信息 节点之间无数据通信无状态可以集群部署 broker  主要负责消息存储功能和消息消费功能 分为...

2016-09-19 13:51 阅读(346) 评论(0)

 

 

rocketmq问题汇总-如何将特定消息发送至特定queue,消费者从特定queue消费

业务描述 由于业务需要这样一种场景,将消息按照id(业务id)尾号发送到对应的queue中,并启动10个消费者(单jvm,10个消费者组),从对应的queue中集群消费,如下图1所示(假设有两个broker组成的集群): producer如何实现 producer只需发送消息时调用如下方法即可 /** * 发送有序消息 * * @param messageMap 消息数...

2016-04-20 11:56 阅读(1963) 评论(1)

 

rocketmq3.26研究之五DefaultMQPushConsumer

占个坑...

2016-02-19 20:48 阅读(2509) 评论(1)

 

rocketmq3.26研究之二broker

占个坑...

2016-02-19 20:45 阅读(1558) 评论(0)

 

rocketmq3.26研究之四DefaultMQProducer

DefaultMQProducer 作为rocketmq生产者的默认实现,其实它并没有做任何实现,其内部引用一个DefaultMQProducerImpl实例进行具体消息发送。 它有一些基础配置,比如多长时间内消息发送多少次还是没成功则放弃(默认为4秒内发送3次,每次发消息默认超时间为3秒),可以参考DefaultMQProducerImpl.sendDefaultImpl...

2016-02-18 18:38 阅读(2750) 评论(1)

 

rocketmq3.26研究之三NameServer

1. NamesrvStartup >该类主要用于读取配置文件,初始化并启动NamesrvController。 2. NamesrvController >该类两个重要功能: >1 接受broker的注册,并返回master地址和ha地址,这样slave注册时就能知道master以及数据同步地址。...

2016-02-15 17:26 阅读(1064) 评论(0)

 

rocketmq3.26研究之一存储层

MapedFile 对MappedByteBuffer的封装,具有创建文件(使用非堆区内存), 写入,提交,读取,释放,关闭等功能 关键字段解释: 1 fileFromOffset 单看这个字段很难明白什么意思,如果联系上MapedFileQueue来看的话,就能明白了,该字段代表了这个文件在queue中的偏移量,比如0,表示queue中的第一个文件,1024表示queue...

2016-02-15 11:26 阅读(2250) 评论(0)

 

rocketmq3.26研究之六DefaultMQPushConsumer消费流程

1 假设关系图如下: 图1 2 启动流程如下: 3 一切美好的事情都从PullMessageService的run方法开始了:   3.1 run方法会不断的从LinkedBlockingQueue中获取PullRequest对象,然后根据PullRequest进行消息拉取。   问题1:是谁把PullRequest放到LinkedBlockingQu...

2016-02-14 17:46 阅读(2355) 评论(0)

 

rocketmq问题汇总-broker配置brokerIp2何时该配置?

HA 说brokerIp2之前需要先说一下rocketmq的高可用功能,rocketmq的broker负责存储消息,提供读写功能,一旦挂掉将无法提供服务。 为了保证高可用,每个broker可以部署为一个master对应一个或多个slave功能,当master挂掉时,consumer从slave拉取数据进行读取。 HA地址 HAServerAddress说明:slave从master拉取...

2016-02-14 17:38 阅读(1829) 评论(0)

 

rocketmq3.26研究之Failover下consumer的表现

1 环境如下: 2 消费流程 参照DefaultMQPushConsumer消费流程 3 failover表现: 3.1 消息拉取异常: 2015-08-12 11:47:13,215 [PullMessageService] ERROR RocketmqClient - pullKernelImpl exception com.alibaba.rocket...

2016-02-14 17:37 阅读(966) 评论(0)

 

rocketmq3.26研究之Failover下producer的表现

1 环境如下: 说明: producer默认会依次轮询  broker_a-q0,broker_a-q1,broker_a-q2,broker_a-q3,broker_b-q0,broker_b--q1,broker_b-q2,broker_b-q3  进行消息发送。 这个对应关系列表暂时称作 topic路由,下面会用到该词语。 2  消息发送流程: 每次发送...

2016-02-14 17:35 阅读(519) 评论(0)

 

rocketmq问题汇总-一个consumerGroup只对应一个topic

1 同一个订阅组内不同Consumer实例订阅不同topic消费混乱问题调查 图1: 背景说明: 如图1左半部分,假设目前的关系如下: broker: 两个,broker_a和broker_b topic:两个,topic1和topic2,每个topic在每个broker上分为4个queue consumer:两个,consumer1和consumer2...

2016-02-14 17:32 阅读(8611) 评论(5)

 

rocketmq问题汇总-instanceName参数何时该设置?

以下只针对集群模式: 1 producer 默认情况下不需要设置instanceName,rocketmq会使用ip@pid(pid代表jvm名字)作为唯一标示如果同一个jvm中,不同的producer需要往不同的rocketmq集群发送消息,需要设置不同的instanceName 原因如下:如果不设置instanceName,那么会使用ip@pid作为producer唯一标识,...

2016-02-14 17:31 阅读(2209) 评论(0)

转载于:https://my.oschina.net/tantexian/blog/1492427

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值