RocketMQ
文章平均质量分 82
meilong_whpu
这个作者很懒,什么都没留下…
展开
-
RocketMQ存储篇——CommitLog
commitlog文件的存储地址:$HOME\store\commitlog\${fileName},每个文件的大小默认1G =1024*1024*1024,commitlog的文件名fileName,名字长度为20位,左边补零,剩余为起始偏移量;比如00000000000000000000代表了第一个文件,起始偏移量为0,文件大小为1G=1073741824;当这个文件满了,第二原创 2017-08-08 17:04:09 · 21520 阅读 · 4 评论 -
RocketMQ——Consumer篇:启动过程
RocketMQ提供了两种消费模式,PUSH和PULL,大多数场景使用的是PUSH模式,这两种模式分别对应的是DefaultMQPushConsumer类和DefaultMQPullConsumer类。PUSH模式实际上在内部还是使用的PULL方式实现的,通过PULL不断地轮询Broker获取消息,当不存在新消息时,Broker会挂起PULL请求,直到有新消息产生才取消挂起,返回新消息。故此处主要讲原创 2017-08-09 09:11:17 · 11699 阅读 · 0 评论 -
RocketMQ——Consumer篇:向Broker同步消费进度的定时任务
每隔5秒调用一次MQClientInstance.persistAllConsumerOffset()方法将消费进度向Broker同步。遍历MQClientInstance.consumerTable: ConcurrentHashMap变量。对于PushConsumer端和PullConsumer端,处理逻辑是一样的,以DefaultMQPushConsumerImpl为例,调用DefaultM原创 2017-08-10 17:26:26 · 4363 阅读 · 0 评论 -
RocketMQ——Consumer端自动地不间断地发起拉取消息的业务逻辑
Consumer端自动地不间断地发起拉取消息的业务逻辑原创 2017-08-11 08:23:34 · 1857 阅读 · 0 评论 -
RocketMQ——Consumer篇:PUSH模式下拉取消息服务的线程(PullMessageService)
只有在PUSH模式下才会使用PullMessageService服务线程,该线程主要是对pullRequestQueue:LinkedBlockingQueue<PullRequest>队列进行监测,处理该队列中的PullRequest请求对象;同时该线程也提供了两种拉取方式,分别是立即拉取和延迟拉取两种;1 拉取消息的处理逻辑在该线程的run方法中,循环地不间断地从pullRequestQueue原创 2017-08-11 08:27:58 · 2306 阅读 · 2 评论 -
RocketMQ——Consumer篇:PUSH模式下的消息拉取(DefaultMQPushConsumer)
DefaultMQPushConsumerImpl中各个对象的主要功能如下:RebalancePushImpl:主要负责决定,当前的consumer应该从哪些Queue中消费消息;1)PullAPIWrapper:长连接,负责从broker处拉取消息,然后利用ConsumeMessageService回调用户的Listener执行消息消费逻辑;2)ConsumeMessageService:实现所谓原创 2017-08-11 08:48:26 · 8837 阅读 · 3 评论 -
RocketMQ——Consumer篇:PUSH模式下消费消息(顺序和并发两种)
1 接受并处理Broker返回的响应消息当发送拉取消息在Broker返回响应消息之后调用NettyRemotingAbstract.processMessageReceived(ChannelHandlerContext ctx, RemotingCommand msg)方法,大致逻辑如下:1、根据返回的响应对象RemotingCommand的opaque(请求序列号)从NettyRemotingA原创 2017-08-11 09:00:45 · 6380 阅读 · 0 评论 -
RocketMQ——Consumer篇:PULL消费模式下的调度消费服务
与PUSH模式相比,PULL模式需要应用层不间断地进行拉取消息然后再执行消费处理,提高了应用层的编码复杂度,为了Pull方式的编程复杂度,RocketMQ提供了调度消费服务(MQPullConsumerScheduleService),在topic的订阅发送变化(初次订阅或距上次拉取消息超时)就触发PULL方式拉取消息。1 应用层使用方式该类是PULL模式下面的调度服务,当RebalanceImp原创 2017-08-11 09:12:20 · 5557 阅读 · 0 评论 -
RocketMQ——Consumer篇:PULL模式下的消息消费(DefaultMQPullConsumer)
1 应用层的使用方式在应用层初始化DefaultMQPullConsumer类,然后调用该类的start方法启动Consumer;接下来的消费步骤如下:1、调用DefaultMQPullConsumer.fetchSubscribeMessageQueues(String topic)方法,根据topic获取对应的MessageQueue(即可被订阅的队列),在该方法中最终通过调用MQAdminIm原创 2017-08-11 09:20:13 · 7107 阅读 · 0 评论 -
RocketMQ——其他注意事项
1 消息过滤的方式1、简单消息过滤。订阅时指定topic下面tags;2、高级消息过滤。2.1)Broker所在的机器会启动多个FilterServer过滤进程;2.2)Consumer启动后,会向FilterServer上传一个过滤的Java类;2.3)Consumer从FilterServer拉消息,FilterServer将请求转发给Broker,FilterServer从Broker收到消息原创 2017-08-11 09:23:12 · 1546 阅读 · 0 评论 -
RocketMQ存储篇——整体结构以及MappedFile讲解
讲解RocketMQ的数据存储整体结构以及大文件操作对象MapedFile原创 2017-08-08 16:46:20 · 5367 阅读 · 1 评论 -
如何保障微服务架构下的数据一致性
随着微服务架构的推广,越来越多的公司采用微服务架构来构建自己的业务平台。就像前边的文章说的,微服务架构为业务开发带来了诸多好处的同时,例如单一职责、独立开发部署、功能复用和系统容错等等,也带来一些问题。例如上手难度变大,运维变得更复杂,模块之间的依赖关系更复杂,数据一致性难以保证,等等。但是办法总是比问题多,本篇文章就来介绍一下我们是如何保障微服务架构的数据一致性的。转载 2017-09-15 09:04:16 · 7168 阅读 · 0 评论 -
RocketMQ——Producer篇:其他功能介绍
1 向Broker发送心跳消息1、初始化HeartbeatData对象,将该Producer或Consumer的ClientID赋值给HeartbeatData对象的clientID变量;2、遍历MQClientInstance.consumerTable: ConcurrentHashMap<String/* group */, MQConsumerInner>变量,根据每个MQConsumer原创 2017-08-09 09:10:05 · 1564 阅读 · 0 评论 -
RocketMQ——Producer篇:启动过程
在应用层初始化DefaultMQProducer的过程中,以Producer名称或者RPCHook的任一个或两个作为参数初始化DefaultMQProducer对象,内部以这些参数初始化了DefaultMQProducerImpl对象,其中,RPCHook是接口,由业务层来实现doBeforeRequest和doAfterResponse方法。在初始化之后对DefaultMQProducer对象设置原创 2017-08-09 09:06:51 · 2402 阅读 · 0 评论 -
RocketMQ——从NameServer更新客户端订阅的topic路由信息
由Producer或Consumer端调用MQClientInstance. updateTopicRouteInfoFromNameServer()方法的目的主要有:1)从NameServer获取该客户端订阅的每个topic的相关信息(包括每个topic对应的Broker信息和topic配置信息),用TopicRouteData对象表示;并将该对象信息存入MQClientInstance.topi原创 2017-08-09 09:03:54 · 1929 阅读 · 1 评论 -
RocketMQ存储篇——MapedFileQueue
1.3 MapedFileQueue应用层访问commitlog和consumequeue文件是通过MappFileQueue来操作MapedFile类,从而间接操作磁盘上面的文件;MappFileQueue是由多个MapedFile队列组成的,该类的结果如下图所示。 功能清单如下:1.3.1 获取在某时间点之后更新的文件(getMapedFileByTime) 方法getM原创 2017-08-08 16:55:35 · 1240 阅读 · 0 评论 -
RocketMQ存储篇——Consumequeue
Consumequeue类对应的是每个topic和queuId下面的所有文件。Consumequeue类文件的存储路径默认为$HOME/store/consumequeue/{topic}/{queueId}/{fileName},每个文件由30W条数据组成,每条数据的结构如下图所示: 消息的起始物理偏移量physical offset(long 8字节)+消息大小size(int 4字节)+ta原创 2017-08-08 17:23:21 · 6266 阅读 · 1 评论 -
RocketMQ存储篇——Config文件以及执行延迟消息的线程服务
在$HOME\store\config目录下面存储各类config文件,包括:consumerOffset.json、delayOffset.json、subscriptionGroup.json、topics.json四类config文件。 topics.json文件由TopicConfigManager类解析并存储;存储每个topic的读写队列数、权限、是否顺序等信息。 consumerOf原创 2017-08-08 17:33:15 · 2057 阅读 · 1 评论 -
RocketMQ存储篇——HA高可用
在集群模式的部署方式中,Master与Slave配对是通过指定相同的brokerName参数来配对,Master的BrokerId必须是0,Slave的BrokerId必须是大于0的数。一个Master下面可以挂载多个Slave,同一个Master下的多个Slave通过指定不同的BrokerId来区分。有4种部署方式: 部署方式 优点 缺点 备注 单个Master模式 一旦Br原创 2017-08-08 17:43:46 · 10641 阅读 · 1 评论 -
RocketMQ存储篇——事务消息相关的文件
在RocketMQ-3.1.9版本中,有TransactionStateService类,用于存储每条事务消息的状态。在该类中有两个成员变量tranRedoLog:ConsumeQueue和tranStateTable: MapedFileQueue,其中tranRedoLog变量用于事务状态的Redolog,当进程意外宕掉,可通过redolog恢复所有事务的状态,tranStateTable变量用原创 2017-08-08 17:45:55 · 1001 阅读 · 0 评论 -
RocketMQ——Name Server篇
1 NameServer的功能1、每个Broker启动的时候会向Namesrv发送注册请求,Namesrv接收Broker的请求注册路由信息,NameServer保存活跃的broker列表,包括Master和Slave;2、用来保存所有topic和该topic所有队列的列表;3、NameServer用来保存所有broker的Filter列表4、接收client(Producer和Consumer)的原创 2017-08-08 17:48:36 · 7996 阅读 · 0 评论 -
RocketMQ——Broker篇
1 Broker的初始化过程调用BrokerController对象的initialize方法进行初始化工作。大致逻辑如下:1、加载topics.json、consumerOffset.json、subscriptionGroup.json文件,分别将各文件的数据存入TopicConfigManager、ConsumerOffsetManager、SubscriptionGroupManager对原创 2017-08-09 08:47:34 · 11133 阅读 · 5 评论 -
RocketMQ——Producer篇:发送普通消息
以DefaultMQProducer.send(Message msg)方法为例,讲解Producer消息的发送逻辑,该方法最终调用DefaultMQProducerImpl.sendDefaultImpl(Message msg, CommunicationMode communicationMode, SendCallback sendCallback, long timeout)方法完成消息的原创 2017-08-09 08:53:54 · 4751 阅读 · 2 评论 -
RocketMQ——Producer篇:发送定时消息
目前只支持固定精度级别的定时消息,服务器按照1-N定义了如下级别: “1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h”;若要发送定时消息,在应用层初始化Message消息对象之后,调用Message.setDelayTimeLevel(int level)方法来设置延迟级别,按照序列取相应的延迟级别,例如level=2,则延迟为5原创 2017-08-09 08:55:29 · 6053 阅读 · 0 评论 -
RocketMQ——Producer篇:发送顺序消息
顺序消息主要是指局部顺序,即生产者通过将某一类消息发送至同一个队列来实现。与发生普通消息相比,在发送顺序消息时要对同一类型的消息选择同一个队列,即同一个MessageQueue对象。 目前RocketMQ定义了选择MessageQueue对象的接口MessageQueueSelector,里面有方法select(final List mqs, final Message msg, final Ob原创 2017-08-09 08:56:05 · 2784 阅读 · 1 评论 -
RocketMQ——Producer篇:发送事务消息
该事务消息是指Producer端的业务逻辑处理与向MQ发送消息事件是在同一个事务里面,即这两件事件要么同时成功要么同时失败。 可以解决如下类似场景的问题:A用户和B用户的账户体系不在同一台服务器上面,现在A用户向B用户转账100元,为了提高执行效率,就采用消息队列的方式实现异步处理。大致逻辑是A用户扣款100元,然后发送消息给消息队列,B用户的程序从队列中获取转账信息并向B用户上账100元。 若原创 2017-08-09 08:56:43 · 4102 阅读 · 0 评论 -
RocketMQ存储篇——IndexFile和IndexService
1 IndexFile为操作Index文件提供访问服务,Index文件的存储位置是:$HOME \store\index\${fileName},文件名fileName是以创建时的时间戳命名的,文件大小是固定的,等于40+500W*4+2000W*20= 420000040个字节大小。 1.1 Index文件的数据结构 Index Header结构各字段的含义:beginT原创 2017-08-08 17:29:12 · 4084 阅读 · 2 评论