从 RocketMQ 学基于文件的编程模式(一)

消息存储格式看文件编程

从 commitlog 文件的设计来学文件编程

我们知道 RocketMQ 的全量消息存储在 commitlog 文件中,每条消息的大小不一致,那如何对消息进行组织呢?当消息写入到文件中后,如果判别一条消息的开始与结束呢?

首先基于文件的编程模型,首先需要定义一套消息存储格式,用来表示一条完整的消息,例如 RocketMQ 的消息存储格式如下图所示:

1

从这里我们可以得到一种通用的数据存储格式定义实践:通常存储协议遵循 Header + Body,并且 Header 部分是定长的,存放一些基本信息,body 存储数据,在 RocketMQ 的消息存储协议,我们可以将消息体的大小这 4 个字节看成是 Header,后面所有的字段认为是与消息相关的业务属性,按照指定格式进行组装即可。

针对 Header + Body 这种协议,我们通常的提取一条消息会分成两个步骤,先将 Header 读取到 ByteBuffer 中,在 RocketMQ 中的消息体,会读出一条消息的长度,然后就可以从消息的开头处读取该条消息长度的字节

猜你喜欢

转载自blog.csdn.net/prestigeding/article/details/109335911