RocketMQ-消息存储(一):写入过程

本文详细介绍了RocketMQ中消息的写入过程,包括检查消息格式、分配CommitLog文件、创建全局消息ID、计算消息总长度以及根据策略处理磁盘空间等。在写入过程中,消息首先被追加到MappedFile内存缓冲区,然后根据同步或异步刷盘策略持久化到磁盘。

1、当前broker停止工作或为slave则拒绝写入;消息主题长度超过256个字符、消息属性长度超过65536个字符则拒绝该消息写入

2、如果消息的延迟级别大于0 ,将消息的原主题名称与原消息队列 ID 存入消息属 性中,用延迟消息主题 SCHEDULE TOPIC 、消息队列 ID 更新原先消息的主题与队列,这是并发消息消费重试关键的一步

3、获取当前可以写入的commitLog文件:
Commitlog 文件存储目录为KaTeX parse error: Expected 'EOF', got '}' at position 14: {ROCKET_HOME }̲/ store commitl…{ROCKET_HOME }/store/commitlog 文件夹,而 MappedFile 则对应该文件夹下一个个的文件。

4、在写入 CornrnitLog 之前,先申请 putMessageLock ,也就是将消息存储到 CornrnitLog 文件中是串行的

5、设置消息的存储时间,如果mappedFile 为空,表明$ {ROCKET_HOME}/store/ commitlog 目录下不存在任何文件,说明本次消息是第一次消息发送,用偏移量0 创建第 一个 commit 文件,文件为 00000000000000000000 ,如果文件创建失败,抛出 CREATE MAPEDFILE FAILED ,很有可能 是磁盘空间不足或权限不够

6、将消息追加到 MappedFile。 首先先获取 MappedFile 当前写指针,如果 currentPos 大于或等于文件大小则表明文件已写满,抛出 AppendMessageStatus. UNKNOWN_ ERROR 。如果 currentPos 小于文件大小,通过 slice ()方法创建 个与 MappedFile 的共享内存区,并设置 position 为当前指针

7、创建全局唯一消息 ID ,消息 ID有 16 字节
但为了消息 ID 可读性,返回给应用程序的 msgld 为字符类型,可以通过 UtilAll. bytes2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值