RocketMQ 笔记1

RocketMQ 物理部署结构


如上图所示, RocketMQ的部署结构有以下特点:


1.Name Server是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。
2.Broker部署相对复杂,Broker分为Master与Slave,一个Master可以对应多个Slave,但是一个Slave只能对应一个Master,Master与Slave的对应关系通过指定相同的BrokerName,不同的BrokerId来定义,BrokerId为0表示Master,非0表示Slave。Master也可以部署多个。每个Broker与Name Server集群中的所有节点建立长连接,定时注册Topic信息到所有Name Server。
3.Producer与Name Server集群中的其中一个节点(随机选择)建立长连接,定期从Name Server取Topic路由信息,并向提供Topic服务的Master建立长连接,且定时向Master发送心跳。Producer完全无状态,可集群部署。

4.Consumer与Name Server集群中的其中一个节点(随机选择)建立长连接,定期从Name Server取Topic路由信息,并向提供Topic服务的Master、Slave建立长连接,且定时向Master、Slave发送心跳。Consumer既可以从Master订阅消息,也可以从Slave订阅消息,订阅规则由Broker配置决定。


RocketMQ 数据存储结构


如上图所示,RocketMQ采取了一种数据与索引分离的存储方法。有效降低文件资源、IO资源,内存资源的损耗。即便是阿里这种海量数据,高并发场景也能够有效降低端到端延迟,并具备较强的横向扩展能力。

以上摘自十分钟入门RocketMQ


存储目录结构
{user.dir}/store/
checkpoint
config/consumerOffset.json  topic.json  等保存broker的topic信息,consumer集群消费进度等
index/20180228100504690    索引文件,消息里面设置的key,形成的索引
commitlog/00000000000000000000   消息文件
consumequeue/{topic}/{queueId}/00000000000000000000   consumequeue文件

lock


RocketMQ broker主从配置,conf目录下
org.apache.rocketmq.store.CommitLog.handleHA(AppendMessageResult, PutMessageResult, MessageExt)

1.2m-noslave 多个master没有slave,brokerId为0表示为master

broker-b.properties
brokerClusterName=DefaultCluster
brokerName=broker-b
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH

2.2m-2s-sync 多主多从,同步双写,写消息时候,master写完后同步写slave,再返回写结果

broker-a.properties
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=SYNC_MASTER
flushDiskType=ASYNC_FLUSH

broker-a-s.properties
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
3.2m-2s-async  多主多从,异步复制,写消息时候,master写完后就返回结果,slave异步复制
brokerRole=ASYNC_MASTER
brokerRole=SLAVE




RocketMQ broker刷盘
SYNC_FLUSH,
ASYNC_FLUSH

org.apache.rocketmq.store.CommitLog.handleDiskFlush(AppendMessageResult, PutMessageResult, MessageExt)

一些理解:
RocketMQ consumequeue 用来把同一topic的消息分在不同的组,写的时候消息可以指定queueId,不指定随机,
在consumer端集群消费时候,按照这个组来分配给同一group的不同consumer,增加读写并发效率,还有负载均衡


consumer消费时候会保存消费进度,具体就是queueId和offset,集群消费需要broker保存这些信息
org.apache.rocketmq.client.consumer.store.OffsetStore

每次拉取消息时候需要发送这两个信息,broker根据这两个信息查询对应消息返回,同时还要返回nextOffset


DefaultMQPushConsumer工作过程


1.RebalanceImpl里面的ConcurrentMap<String/* topic */, Set<MessageQueue>> topicSubscribeInfoTable
保存着topic的所有messageQueue,如何更新的?
org.apache.rocketmq.client.impl.factory.MQClientInstance.start()->startScheduledTask()
->updateTopicRouteInfoFromNameServer()->updateTopicRouteInfoFromNameServer()->
mQClientAPIImpl.getTopicRouteInfoFromNameServer->DefaultMQPushConsumerImpl.updateTopicSubscribeInfo(String, Set<MessageQueue>)
->this.rebalanceImpl.topicSubscribeInfoTable.put(topic, info);






2.负载均衡过程
org.apache.rocketmq.client.impl.factory.MQClientInstance.start()->this.rebalanceService.start()->
每20秒mqClientFactory.doRebalance()->DefaultMQPushConsumerImpl.doRebalance()->
RebalanceImpl.doRebalance(boolean)->rebalanceByTopic->AllocateMessageQueueStrategy.allocate->
updateProcessQueueTableInRebalance->dispatchPullRequest(pullRequestList) 给分配到的messageQueue分配拉取消息请求




3.拉取消息过程
提交pullRequest后->pullMessageService.start()->DefaultMQPushConsumerImpl.pullMessage(PullRequest)->
this.pullAPIWrapper.pullKernelImpl()->PullCallback.onSuccess(PullResult pullResult)->
DefaultMQPushConsumerImpl.this.consumeMessageService.submitConsumeRequest 提交处理消息任务
-> 设置NextOffset再次提交,持续拉取 ->
ConsumeMessageConcurrentlyService.submitConsumeRequest(List<MessageExt>, ProcessQueue, MessageQueue, boolean)
->consumeExecutor.submit(consumeRequest)->ConsumeRequest.run()->

MessageListenerConcurrently.consumeMessage(List<MessageExt>, ConsumeConcurrentlyContext)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然,我可以为您提供有关RocketMQ的一些笔记。这是一个开源的分布式消息中间件系统,由阿里巴巴集团开发和维护。RocketMQ具有高可用性、高吞吐量和可伸缩性,适用于构建实时数据处理、大规模消息系统和事件驱动架构等场景。 下面是一些关键点和要点: 1. 架构:RocketMQ采用了主题(Topic)和队列(Queue)的概念。主题是消息的逻辑分类,队列则是主题的物理分区。每个队列都有自己的消费者组来处理消息。 2. 消息模型:RocketMQ支持两种消息模型:发布/订阅模型和点对点模型。在发布/订阅模型中,消息发送到主题,然后订阅者从主题订阅消息。在点对点模型中,消息发送到队列,然后消费者从队列中消费消息。 3. 可靠性:RocketMQ提供了多种机制来确保消息的可靠性传输,包括同步发送、异步发送和定时发送。还支持消息顺序发送和顺序消费。 4. 高可用性:RocketMQ通过主从复制和Broker集群来实现高可用性。每个主题的队列都可以在多个Broker之间进行复制,以实现数据冗余和容错。 5. 扩展性:RocketMQ可以通过添加更多的Broker节点来扩展系统容量和吞吐量。还支持动态扩展和缩减Broker集群。 6. 消息过滤:RocketMQ支持基于Tag或SQL表达式的消息过滤,以便订阅者只接收感兴趣的消息。 这只是RocketMQ的一些基本信息,还有很多其他特性和概念,如事务消息、消息轨迹、延迟消息等。如果您对RocketMQ有进一步的疑问,请随时提问!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值