RocketMQ的消息存储格式

2019-11-03  本文已影响0人  无醉_1866

总体代码

我们可以通过阅读RocketMQ的消息存储代码来了解RocketMQ的消息存储格式,消息的存储入口是DefaultMessageStore,我们可以通过DefaultMessageStore.putMessage方法来查看消息的存储,整个存储过程示例图如下:

image

详细格式

根据前文的描述,想要知道消息存储的编码格式,我们可以进入到DefaultMessageAppendCallback中,阅读一下doAppend方法的逻辑:

image

其中包含一个msgStoreItemMemory,它是个ByteBuffer,用于存储编码后的消息,消息的编码实际上就是将消息转换成字节的方式,但是这个过程又与对象的二进制序列化不一样,消息中的消息体是对象经过了序列化之后的数据,由生产者发送给了broker,而这里的二进制转换是通过编码的方式实现的,其中不仅需要有消息体的内容,还需要包括很多额外的数据,DefaultAppendMessageCallback的doAppend方法中,我们可以看到具体的消息编码代码:

image

根据这段代码能够清晰的看到消息编码的过程,我们可以看到每个消息在存储时所需要携带的附加信息,在Java中,int占4字节,long占8字节,char占2字节,由此可以得到RocketMQ的消息在编码后的结构如下图:

image
上一篇 下一篇

猜你喜欢

热点阅读