RocketMQ 整合 DLedger(多副本)即主从切换实现平滑升级的设计技巧

开头

在找工作的过程中,对于 Redis 技术知识的掌握已经成为必须的技能。美团面试常常就会被问到Redis相关知识,而这次我就差点倒在了美团3面,面试官连问我以下几个Redis的问题,然后就卡壳了…

  1. redis了解吗?你说说怎么用redis实现分布式锁?

  2. Redis常用数据结构及底层数据结构实现

  3. 如何解决 Redis 的并发竞争 Key 问题

  4. 如何保证缓存与数据库双写时的数据一致性?

    剩下的不太记得了…为此面试完回来针Redis专门做了一个面试问题大总结

在这里插入图片描述

DLedgerCommitlog 继承自 Commitlog。让我们一一来看一下它的核心属性。

  • DLedgerServer dLedgerServer

基于 raft 协议实现的集群内的一个节点,用 DLedgerServer 实例表示。

  • DLedgerConfig dLedgerConfig

DLedger 的配置信息。

  • DLedgerMmapFileStore dLedgerFileStore

DLedger 基于文件映射的存储实现。

  • MmapFileList dLedgerFileList

DLedger 所管理的存储文件集合,对比 RocketMQ 中的 MappedFileQueue。

  • int id

节点ID,0 表示主节点,非0表示从节点

  • MessageSerializer messageSerializer

消息序列器。

  • long beginTimeInDledgerLock = 0

用于记录 消息追加的时耗(日志追加所持有锁时间)。

  • long dividedCommitlogOffset = -1

记录的旧 commitlog 文件中的最大偏移量,如果访问的偏移量大于它,则访问 dledger 管理的文件。

  • boolean isInrecoveringOldCommitlog = false

是否正在恢复旧的 commitlog 文件。

接下来我们将详细介绍 DLedgerCommitlog 各个核心方法及其实现要点。

[](()3.2 构造方法

public DLedgerCommitLog(final DefaultMessageStore defaultMessageStore) {

super(defaultMessageStore); // @1

dLedgerConfig = new DLedgerConfig();

dLedgerConfig.setEnableDiskForceClean(defaultMessageStore.getMessageStoreConfig().isCleanFileForciblyEnable());

dLedgerConfig.setStoreType(DLedgerConfig.FILE);

dLedgerConfig.setSelfId(defaultMessageStore.getMessageStoreConfig().getdLegerSelfId());

dLedgerConfig.setGroup(defaultMessageStore.getMessageStoreConfig().getdLegerGroup());

dLedgerConfig.setPeers(defaultMessageStore.getMessageStoreConfig().getdLegerPeers());

dLedgerConfig.setStoreBaseDir(defaultMessageStore.getMess

你可能感兴趣的:(Java,经验分享,开发语言,面试)