一、Broker 介绍
Broker 是 RocketMQ 的核心,大部分 "重量级" 工作都是由 Broker 完成的,如:
* 接收 Producer 发送的消息
* 处理 Consumer的消费消息请求
* 消息的持久化存储
* 消息的 HA 机制
* 服务器过滤功能
......
二、消息的存储结构
RocketMQ 的消息存储由 ConsumeQueue 和 CommitLog 配合完成。
2.1 ConsumeQueue
* ConsumeQueue 是消息的逻辑队列,类似数据库的索引文件,存储着指向物理存储的地址。每个 Topic 下的每个 MessageQueue 都有一个对应的 ConsumeQueue 文件。
* 文件所在路径: ${$storeRoot}consumequeue${topicName}${queueId}${fileName}。
2.2 CommitLog
* CommitLog 是物理存储文件,每个 Broker 上的 CommitLog 被本机器所有的 ConsumeQueue 共享。
* 文件所在路径:${user.homt}store${commitlog}${fileName}。
2.3 存储顺序
RocketMQ 通过一些机制来保证,尽量向 CommitLog 中顺序写入,但是可以随机读取。
三、高可用机制
Broker 集群通过 Master 和 Slave 的配合达到高可用性,通过在 Broker 的配置文件中设置参数 brokerId 来区分是 Master 还是 Slave:
* brokerId 等于 0 表示这个 Broker 是 Master;
* brokerId 大于 0 表示这个 Broker 是 Slave;
Master 支持读和写操作,Slave 只支持读操作。
四、同步刷盘与异步刷盘
4.1 什么叫做刷盘?
* RocketMQ 消息存储方式为内存+磁盘存储;
* 刷盘是指将内存的数据写入到磁盘中的操作;
* 刷盘分为同步刷盘和异步刷盘
4.2 异步刷盘
当执行消息写入操作时,当消息写入到内存中时,就返回写成功状态。当内存中的消息量积累到一定量时,统一触发写磁盘动作。
4.3 同步刷盘
当执行消息写入操作时,同步写入内存和磁盘中后才返回写成功状态。
4.4 刷盘方式配置
通过 Broker配置文件中的 fulshDiskType 参数配置:
* SYNC_FLUSH:同步刷盘
* ASYNC_FLUSH:异步刷盘
建议使用 异步刷盘 形式。
五、同步复制和异步复制
5.1 什么叫做复制?
Broker 集群有 Master 和 Slave 两种角色,消息需要从 Master 复制到 Slave 上;
5.2 异步复制
当执行消息写入操作时,只要 Master写成功即可反馈给客户端成功状态
5.3 同步复制
当执行消息写入操作时, Master和 Slave 均写成功才反馈给客户端成功状态
5.4 复制方式配置
通过 Broker配置文件中的 brokerRole 参数配置:
* ASYNC_MASTER:异步复制
* SYNC_MASTER:同步复制
* SLAVE
建议使用 SYNC_MASTER 形式。