接上面说到metaq也就是rocketMq的 特性及适用场景,以及代码实现
1 存储特点
(1)消息主体以及元数据都存储在**CommitLog**当中,所有的消息都是持久化的.
(2)Consume Queue是一个逻辑队列,存储了这个Queue在CommiLog中的起始offset,log大小和MessageTag的hashCode。
(3)每次读取消息队列先读取consumerQueue,然后再通过consumerQueue去commitLog中拿到消息主体。
( 4 ) 因为设计理念来自kafka所以为了解决kafka的消息队列增多而lowait增加,metaq的队列都是数据较小而且串行刷盘,防止磁盘竞争引起tps下降.
( 5 )消息的读写都主要用到了零拷贝技术,提高了文件的读写效率.
2 关键特性
(1). 单机支持1 万以上持久化队列
(2). 所有数据单独存储到一个Commit Log,完全顺序写,随机读。
(3). 对最终用户展现的队列实际只存储消息在Commit Log 的位置信息,并且串行方式刷盘。
现在Google一下就有很多的源码的实现的讲解,我想重点关注下刷盘策略:
刷盘策略分同步刷盘和异步刷盘
consumeQueue的消息处理
消息存储开始只是把消息主体存储到了物理文件中,但是并没有把消息处理到consumeQueue文件中.
任务处理一般都分为两种:
一种是同步,把消息主体存入到commitLog的同时把消息存入consumeQueue,rocketMQ的早期版本就是这样处理的。
另一种是异步处理,起一个线程,不停的轮询,将当前的consumeQueue中的offSet和commitLog中的offSet进行对比,将多出来的offSet进行解析,然后put到consumeQueue中的MapedFile中。