此文为转载,请访问原文,其他文章也不错

深入研究RocketMQ生产者发送消息的底层原理 - H.U.C-王子 - 博客园

前言

hello,小伙伴们,王子又来和大家研究RocketMQ的原理了,之前的文章RocketMQ生产部署架构如何设计中,我们已经简单的聊过了生产者是如何发送消息给Broker的。

我们简单回顾一下这个过程。

生产者首先声明一个Topic,然后为了把消息存到对应的Topic中,先从NameServer拉取注册信息获取到Topic存放在哪个Broker中,然后就可以访问对应的Broker发送消息了。

大体流程就是这样,那么这个过程中具体都发生了什么呢,王子今天就和大家深入的探讨一下这其中的奥秘。

什么是MessageQueue

要弄明白生产者发送消息的原理,先要理解什么是MessageQueue。

在生产者声明Topic的时候,是要指定一个关键的参数的,就是MessageQueue,就是指定了你的Topic里面包含几个MessageQueue。

那么这个MessageQueue是做什么用的呢?

直接翻译过来就是消息队列,那么就可以理解成一个Topic对应多个MessageQueue,然后把消息存放到Topic下的消息队列中。

其实Topic、MessageQueue、Broker之间是有关联的。

现在假设我们有一个Topic,指定了它有4个MessageQueue,那么这个Topic在分布式的Broker中是如何存储的呢?

前面的文章我们就聊过,Topic的数据是分布式存储在多个Broker中的,如下图:

那么Topic中的一部分数据是通过什么渠道存储在不同的Broker集群中的呢?

相信小伙伴们都猜到了,就是通过MessageQueue,本质上来讲就是一个数据分片的机制。

假设我们的Topic中有1万条数据,那么可能会平均分布到4个MessageQueue中分片存储(这里不是绝对的,可以根据消息写入的策略来定)。

那么这4个MessageQueue又是怎么存储在Broker上的呢?

很有可能就是每个Broker上存放两个MessageQueue。所以MessageQueue是RocketMQ中非常关键的数据分片机制,实现了Topic数据的分布式存储。

生产者发送消息存入哪个MessageQueue

接下来我们思考一下,生产者发送消息的时候是如何确定存入哪个MessageQueue呢?

我们之前说过,存放消息之前,首先会从NameServer中拉取元数据,在元数据中生产者可以知道Topic有几个MessageQueue,每个MessageQueue存放在哪个Broker集群上。

然后呢,既然生产者知道了这些信息,我们暂时就认为生产者会把消息均匀的发送给当前Topic下的所有MessageQueue中。

比如一共20条消息,4个MessageQueue,那么每个MessageQueue中就存放5条消息。

至于其他的存放策略,我们之后的文章再仔细探讨。

通过这样的方式,生产者发送消息的请求就可以分布在多台的Broker上,那假设我们的每台Broker都可以抗下10万并发,两个Broker就可以抗下20万的并发。

同时,因为我们的消息数据是分片式存储在多个MessageQueue中的,MessageQueue又分布在多个Broker集群中,这样就可以保证RocketMQ存储海量消息了。

如果Broker发生故障怎么办

对于Broker发生故障这一问题,我们之前的文章已经讲过了,小伙伴们可以回顾一下:Broker的主从架构是怎么实现的?

主要使用的是4.5版本后的Dledger自动化切换主从的集群,当MasterBroker挂掉后是可以自动实现Slave到Master的转变的。

那么这里为什么我们还要谈这个问题呢?

小伙伴们想一下,如果MasterBroker挂掉了,要实现主从切换这一过程是需要时间的。

那么在切换的过程中,如果我们的生产者仍然发送消息过来,并且定位到了这台挂掉的MasterBroker,不就无法正常的写入数据了吗。

如果我们还是按照之前说的平均分发消息到MessageQueue,那么就会导致一段时间内访问到故障Broker上时全部是失败的。

对于这个问题,我们可以在生产者中开启一个开关:sendLatencyFaultEnable=true

一旦开启这个开关,它有个自动容错机制。

比如访问Broker时发现Broker响应超时或返回错误,那么在之后的一段时间里,就不会再去访问这个Broker集群了。

这样的话,当Broker发生故障,一段时间内生产者就不会频繁的访问这个发生异常的Broker集群了,过段时间后再去访问。

可能这个时候我们的主从切换已经结束了,这样再次访问的时候就正常了。

总结

今天我们主要聊了聊什么是MessageQueue,MessageQueue在RocketMQ中扮演什么角色,生产者是如何写消息到MessageQueue的,Broker发生故障生产者是如何保证自动容错的。

相信小伙伴们应该会有一些收获,那我们下期的消息中间件系列再见。

思考:

细节
1.发送消息,先创建topic及其队列,在broker的分布情况,存储时再根据topic拉取这些信息,确认存在哪个broker哪个队列
2.broker集群如何选择,一个broker多个队列选择算法

深入研究RocketMQ生产者发送消息的底层原理相关推荐

  1. 【kafka系列】kafka之生产者发送消息实践

    目录 一.准备工作 二.终端命令 生产者命令 消费者命令 三.Java实践 搭建项目 异步发送-无回调 异步发送-有回调 同步发送 一.准备工作 进入实战之前先熟悉一下topic的相关命令,使用终端命 ...

  2. 【Java从0到架构师】RocketMQ 使用 - 发送消息、接收消息、特殊消息

    RocketMQ 消息中间件 入门案例 NameServer 地址 发送消息 同步发送消息 异步发送消息 一次性发送消息 生产者组.消息封装 接收消息 消费方式:推式消费.拉式消费 消息方式:集群模式 ...

  3. 线上问题-kafka生产者发送消息总是失败

    问题解决过程 线上一个界面发现老是没有数据,排查下来时生产者没有成功发送消息所致,报错如下: org.springframework.kafka.core.KafkaProducerException ...

  4. 生产者发送消息的过程?

    1.Producer先连接到Broker,建立连接Connection,开启一个信道(Channel). 2.Producer声明一个交换器并设置好相关属性. 3.Producer声明一个队列并设置好 ...

  5. Kafka生产者发送消息的三种方式

    Kafka是一种分布式的基于发布/订阅的消息系统,它的高吞吐量.灵活的offset是其它消息系统所没有的. Kafka发送消息主要有三种方式: 1.发送并忘记 2.同步发送 3.异步发送+回调函数 下 ...

  6. RocketMQ3.2.2生产者发送消息自动创建Topic队列数无法超过4个

    问题现象 RocketMQ3.2.2版本,测试时尝试发送消息时自动创建Topic,设置了队列数量为8: producer.setDefaultTopicQueueNums(8); 同时设置broker ...

  7. 10 kafka生产者发送消息的原理

    1.发送原理: 在消息发送的过程中,涉及到了两个线程--main 线程和 Sender 线程.在 main 线程 中创建了一个双端队列 RecordAccumulator.main 线程将消息发送给 ...

  8. RabbitMQ实现生产者发送消息异步confirm

    一.生产者 /*** 异步确认生产者** @author : konsy* @date : 2022-04-12 17:04**/ public class ConfirmMessageProvide ...

  9. 【Kafka消息队列】生产者发送消息流程

    如何描述一条消息? 如何描述一条消息,就是在问这条消息的数据结构是什么? public class ProducerRecord<K, V> {private final String t ...

  10. Kafka实战 - 02 Kafka生产者发送消息至topic实现数据上报

    文章目录 1. 项目背景 2. 依赖和配置 3. 生产者配置 KafkaConfiguration 4. 同步数据Topic枚举 SyncDataTopicEnum 5. 请求体 DataSyncQo ...

最新文章

  1. 苹果MAC OS X怎么安装双系统?
  2. C/C++中传值和传地址(引用)
  3. docker数据卷volume详解
  4. [iOS常见问题] 关于使用QQ做第三方登录的问题!
  5. php acl rbac,建站常用的用户权限管理模型ACL和RBAC的区别
  6. vue lang_新疆人的“lang”是“浪”吗?
  7. php socket 不能用,PHP无法用Socket方式连接MySQ
  8. 【HTML5】网页元素的拖放操作
  9. pandas后几行_天秀!Pandas还能用来写爬虫?
  10. vue.js学习资源大全
  11. 【Luogu1345】周游加拿大(动态规划)
  12. php imagemagick 翻译目录
  13. MagicMongoDBTool 最新代码 以及 开发进度报告
  14. 【车牌识别】基于matlab GUI模板匹配新能源车牌识别【含Matlab源码 865期】
  15. case when的判断顺序_Sql 中的if 判断 case... when
  16. Python获取国内股票数据下载数据api接口
  17. 【工具分享】推荐一款超级好用的截图工具
  18. 【Linux】_面试题之权限、ACL、磁盘空间管理、VDO、SELinux、逻辑卷、服务管理、防火墙策略、故障修复i
  19. android手机 双清,什么是双清、三清、四清?安卓手机刷机为什么要双清或三清、四清?...
  20. 子网的划分 网络号 广播地址计算

热门文章

  1. 蓝墨云活动三种查找算法练习的分析博客
  2. JVM 完整深入解析
  3. 反射机制——获取Class中的方法
  4. 洛谷——P2026 求一次函数解析式
  5. Java_一致性哈希算法与Java实现
  6. android 开发怎么让程序生成的图片文件不会被系统扫描到
  7. mysql concat 能否返回数字_关于Mysql中GROUP_CONCAT函数返回值长度的坑
  8. 64bit 用户空间内核空间
  9. Spring中@Autowired注解用法
  10. LINUX设备驱动之platform总线