作者简介:大家好,我是码炫码哥,前中兴通讯、美团架构师,现任某互联网公司CTO,兼职码炫课堂主讲源码系列专题
代表作:《jdk源码&多线程&高并发》,《深入tomcat源码解析》,《深入netty源码解析》,《深入dubbo源码解析》,《深入springboot源码解析》,《深入spring源码解析》,《深入redis源码解析》等
联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬。码炫课堂的个人空间-码炫码哥个人主页-面试,源码等
释放21集全网最深ConcurrentHashMap的vip视频,复现每一行源码
通过前面的章节,我们已经知道了数据在RocketMQ中是分布式存储的。生产者发送消息时,先从NameServer获取到路由信息,然后根据一定算法将消息发送到某个Master-Broker中。但是, Topic是一个逻辑概念 ,对于某个Topic来说,属于它的消息分布在不同的Broker上,那如何决定消息到底分布在哪个Broker上呢?
一、MessageQueue
我们在创建Topic时,需要指定一个很关键的参数——MessageQueue,比如下图,我们可以在RocketMQ的可视化工作台里去创建一个名为order_topic
的Topic,指定包含4个MessageQueue:
那么Topic、MessageQueue、Broker之间到底是什么关系?
可以先简单的认为: Topic是消息的逻辑分类,消息保存在MessageQueue中,MessageQueue分布在Master-Broker上,Slave-Broker从Master-Broker同步数据。
事实上,MessageQueue本质就是一个数据分片的机制。比如order_topic一共有1万条消息,那么可以大致认为每个MessageQueue保存2500条消息。但是,这不是绝对的,需要根据Producer写入消息的策略来定,可能有的MessageQueue中消息多些,有的少些。我们先暂且认为消息是在MessageQueue上平均分配的,然后MessageQueue也可能平均分布在Master-Broker上,如下图: