消息存储
CommitLog
1、消息内容和元数据都会存在CommitLog日志文件中 2、消息内容不是定长的 3、单个文件大小默认1G 文件名长度为20位 左边补零 剩余为起始偏移量 比如第一个文件名是 00000000000000000000 起始偏移量为0 文件大小为1G=1073741824 当第一个文件写满了 第二个文件为00000000001073741824 起始偏移量为1073741824
ConsumeQueue(消息消费队列)
主要是为了提高消息消费的性能
消费者通过消息消费队列ConsumeQueue(作为索引) 来查找消费的消息
消费队列ConsumeQueue(索引)内容
ConsumeQueue(逻辑消费队列) 作为消费消息的索引 保存了指定Topic下的队列消息在CommitLog中的 起始物理偏移量offset(8个字节) 消息大小size和(4个字节) 消息Tag的HashCode值(8个字节) 每个条目定长20个字节 单个文件有30W个条目 可以像数组一样随机访问每个条目 每个ConsumeQueue文件大约5.72M
consumequeue文件夹的组织方式
topic/queue/file三层组织结构
具体存储路径
$HOME/store/consumequeue/{topic}/{queueId}/{fileName}
IndexFile(索引文件)
通过key或时间区间来查询消息
1、存储位置 $HOME \store\index${fileName} 2、文件名 以创建时的时间戳命名的 3、文件大小 单个文件约为400M 可以存储2000W个索引
存储结构
Broker是混合型存储结构
单个broker所有队列共用一个日志文件
索引和数据分离的存储结构
生产者和消费者使用索引和数据相分离的存储结构
整体流程
1、Producer发送消息至Broker端 2、Broker端使用同步或者异步的方式对消息刷盘持久化 保存至CommitLog中 3、Consumer拉取消息 4、服务端也支持长轮询模式 Broker允许等待30s的时间 只要这段时间内有新消息到达 将直接返回给消费端
页缓存和内存映射
页缓存(PageCache)是OS对文件的缓存 用于加速对文件的读写
程序对文件进行顺序读写的速度几乎接近于内存的读写速度 主要原因就是由于OS使用PageCache机制对读写访问操作进行了性能优化 将一部分的内存用作PageCache