SocketMQ Broker消息存储
CommitLog
Producer发送过来的消息是存储在CommitLog中,Producer端每次发送过来的消息是不等长的,每写满1G就会新建一个CommitLog文件继续写入。
那Consumer消费的时候,怎么获取到消息呢?直接从CommitLog中查询消息的话是低效的,RocketMQ作为一个高性能、高吞吐的消息中间件肯定不会采用这个方案,而是使用ConsumerQueue。
ConsumerQueue
ConsumerQueue也是文件,当Broker收到一条消息,写入CommitLog的同时,也会一条ConsumerQueue记录,保存这条消息在CommitLog中的offset、消息大小、对应的Tag的hash值。
每个MessageQueue都会对应一个ConsumerQueue文件,每个ConsumerQueue文件可写30W条消息,超过之后再新建ConsumerQueue文件继续写入。
主从复制
Broker中有两种角色:Master、Slave,Master用于处理生产者、消费者的请求以及消息的存储,Slave从Master中同步所有数据,有以下两个作用:
- 保证Broker高可用:作为Master的数据副本,当Master宕机后,消费者可以连接Slave继续消费,避免单点故障
- 保证Broker高性能:当Master负载高的时候,Master会建议消费者从Slave上拉取消息,分担Master压力
Broker主从同步的方式有两种:
- 同步复制:生产者发送消息到Master,然后Master将消息同步发送到Slave才算发送完成
- 异步复制:生产者发送消息到Master即完成,再由异步线程异步发送到Slave
Broker主从同步的数据主要是配置数据和消息数据