消息中间件RocketMQ原理解析 - 斩秋加载只是建立文件映射 redoLog 队列恢复,加载本地 redoLog 文件 tranStateTable 事物状态表, 加载本地 tranStateTable 文件 recover: 正常恢复: 利用 tranRedoLog 文件的 recover 利用 tranStateTable 文件重建事物状态表 异常恢复: 先按照正常流程恢复 Tran Redo Log commitLog 异常恢复,commitLog 根据 checkpoint 时间点重新生成 redolog, 重新分发 消息 DispatchRequest, 分发消息到位置信息到 ConsumeQueue 更新 Transaction State Table 记录 Transaction Redo Log 删除事物状态表 tranStateTable tranStateTable 通过 RedoLog 全量恢复 StateTable 重头扫描 RedoLog, 过滤出所有 prepared 状态的消息, 将 commit 或者 rollback 的消息对应的 prepared 消息删除 重建 StateTable, 将上面过滤出的 prepared 消息,添加到事物状态表文件中 这个事物状态表 transstable 的作用是定期(1 分钟)将状态为0 码力 | 57 页 | 2.39 MB | 1 年前3
Apache RocketMQ 从入门到实战二、提出问题 主,从服务器都在运行过程中,消息消费者是从主拉取消息还是从从拉取? RocketMQ 主从同步架构中,如果主服务器宕机,从服务器会接管消息消费,此时消 息消费进度如何保持,当主服务器恢复后,消息消费者是从主拉取消息还是从从服务器拉取, 主从服务器之间的消息消费进度如何同步? 三、原理探究 1. RocketMQ 主从读写分离机制 RocketMQ 的主从同步,在默认情况下 RocketMQ 过物理内存的 40%,则消息读取则由从服务器来接管,实现消息的读写分离,避免主服务 IO 抖动严重。 那问题来了,主服务器宕机后,从服务器接管消息消费后,那消息消费进度存储在哪里?当 主服务器恢复正常后,消息是从主服务器拉取还是从从服务器拉取?主服务器如何得知最新 的消息消费进度呢? RocketMQ 消息消费进度管理(集群模式): 集群模式下消息消费进度存储文件位于服务端${ROCK 消息消费端在主服务器存活的情况下,会优先向主服务器反馈消息消费进度,那从服务 器是如何同步消息消费进度的。 2. 当主服务器宕机后则消息消费端会向从服务器反馈消息消费进度,此时消息消费进度如 何存储,当主服务器恢复正常后,主服务器如何得知最新的消息消费进度。 为了解开上述两个疑问,我们优先来看一下 Broker 服务器在收到提交消息消费进度反 馈命令后的处理逻辑: 客户端定时向 Broker 端发送更新0 码力 | 165 页 | 12.53 MB | 1 年前3
RocketMQ v3.2.4 开发指南beanstalkd,VisiNotify (1)、(2)、(3)三种持丽化方式都具有将内存队列 Buffer 迕行扩展的能力,(4)只是一个内存的镜像,作用是当 Broker 挂掉重启后仍然能将乀前内存的数据恢复出来。 JMS 不 CORBA Notification 规范没有明确说明如何持丽化,但是持丽化部分的性能直接决定了整个消息中间件 的性能。 RocketMQ 参考了 Kafka 的持丽化方式,充分利用 (4). 机器掉电,但是能立即恢复供电情冴。 (5). 机器无法开机(可能是 cpu、主板、内存等关键设备损坏) (6). 磁盘设备损坏。 (1)、(2)、(3)、(4)四种情冴都属亍硬件资源可立即恢复情冴,RocketMQ 在返四种情冴下能保证消息丌丢,戒 者丢失少量数据(依赖刷盘方式是同步迓是异步)。 (5)、(6)属亍单点故障,丏无法恢复,一旦収生,在此单点上的消息全部丢失。RocketMQ 已经消费成功的消息,由亍业务上需求需要重新消费,要支持此功能,Broker 在吐 Consumer 投递成功消息后,消息仍然需要保留。幵丏重新消费一般是挄照时间维度,例如由亍 Consumer 系统故障, 恢复后需要重新消费 1 小时前的数据,那举 Broker 要提供一种机制,可以挄照时间维度来回退消费迕度。 RocketMQ 支持挄照时间回溯消费,时间维度精确到毫秒,可以吐前回溯,也可以吐后回溯。0 码力 | 52 页 | 1.61 MB | 1 年前3
共 3 条
- 1













