消息中间件notify、metaq、kafka对比

接上面说到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中。

你可能感兴趣的:(消息中间件notify、metaq、kafka对比)