RocketMQ消息存储的整体结构

 

RocketMQ的消息存储采用的是混合型的存储结构,也就是Broker单个实例下的所有队列公用一个日志数据文件CommitLog。这个是和Kafka又一个不同之处。

为什么不采用kafka的设计,针对不同的partition存储一个独立的物理文件呢?这是因为在kafka的设计中,一旦kafka中Topic的Partition数量过多,队列文件会过多,那么会给磁盘的IO读写造成比较大的压力,也就造成了性能瓶颈。所以RocketMQ进行了优化,消息主题统一存储在CommitLog中。

当然,这种设计并不是银弹,它也有它的优缺点

优点在于:由于消息主题都是通过CommitLog来进行读写,ConsumerQueue中只存储很少的数据, 所以队列更加轻量化。对于磁盘的访问是串行化从而避免了磁盘的竞争

缺点在于:消息写入磁盘虽然是基于顺序写,但是读的过程确是随机的。读取一条消息会先读取ConsumeQueue,再读CommitLog,会降低消息读的效率。

 

相关文章: