1背景在分布式系统应用中,高可用、一致性是经常面临的问题,针对不同的应用场景,我们会选择不同的架构方式,比如master-slave、基于ZooKeeper选主。随着时间的推移,出现了基于Raft算法自动选主的方式,Raft是在Paxos的基础上,做了一些简化和限制,比如增加了日志必须是连续的,只支持领导者、跟随者和候选人三种状态,在理解和算法实现上都相对容易许多。1)DLedger是openMessaging发布的一个基于Raft实现的JAVA类库,可以方便引用到系统中,满足其高可用、高可靠、强一致的需求,其中在RocketMQ中作为消息Broker存储高可用实现的一种解决方案。2)Raft
RocketMQ在开启Dledger时,使用DLedgerCommitLog,其他情况使用的是CommitLog来管理消息的存储。在Dledger模式下,消息写入时Leader节点还需要将消息转发给Follower节点,有过半的节点响应成功,消息才算写入成功。Leader消息写入Dledger下有DLedgerMemoryStore(基于内存存储)和DLedgerMmapFileStore(基于Mmap文件映射)两种方式写入,接下来以DLedgerMmapFileStore为例,看下消息的写入过程。Leader节点在写入前会为消息构建DLedgerEntry对象,之后本地写入以及转发给Foll
消息存储在【RocketMQ】消息的存储一文中提到,Broker收到消息后会调用CommitLog的asyncPutMessage方法写入消息,在DLedger模式下使用的是DLedgerCommitLog,进入asyncPutMessages方法,主要处理逻辑如下:调用serialize方法将消息数据序列化;构建批量消息追加请求BatchAppendEntryRequest,并设置上一步序列化的消息数据;调用handleAppend方法提交消息追加请求,进行消息写入;publicclassDLedgerCommitLogextendsCommitLog{@OverridepublicComp
消息存储在【RocketMQ】消息的存储一文中提到,Broker收到消息后会调用CommitLog的asyncPutMessage方法写入消息,在DLedger模式下使用的是DLedgerCommitLog,进入asyncPutMessages方法,主要处理逻辑如下:调用serialize方法将消息数据序列化;构建批量消息追加请求BatchAppendEntryRequest,并设置上一步序列化的消息数据;调用handleAppend方法提交消息追加请求,进行消息写入;publicclassDLedgerCommitLogextendsCommitLog{@OverridepublicComp