【Dledger】-源码解读

一、背景

Dledger是RocketMQ4.5以后推出来的功能,用于实现副本的集群选举

源码地址: 机智的路易 / dledger

二、架构设计

通信层

(一)协议

使用Raft算法
在这里插入图片描述

(二)请求与响应

Entry

  • GetEntries
  • PullEntries
  • PushEntries

HeatBeat

VoteRequest

Metadata

  • MetadataRequest
  • MetadataRepose

AppendEntry

  • AppendEntryRequest
  • AppendEntryReponse
  • BatchAppendEntryRequest

异步
基本都使用异步操作来实现
在这里插入图片描述

存储层

(一)Command

对操作系统的操作,提供了4种命令

  • GetCommand:
  • LeadershipTransferCommand:
  • ReadFileCommand:
  • AppendCommand:
    在这里插入图片描述
(二)mmp

三、启动与停止

(一)启动参数

使用com.beust.jcommander.JCommander接收启动的环境变量传入,实现命令行交互。

参数                  默认值                含义
-g  --group           default               组名
-i  --selfId          n0                    id
-p  --peers           n0-localhost:20911    端口
-s  --storeBaseDir    D:/tmp/dledgerstore   保存目录

默认存储在当前磁盘下的

/tmp/dledgerstore/dledger-n0
在这里插入图片描述

DLedgerConfig

在这里插入图片描述

(二)启动流程

(1)属性注入(没属性,则默认)
(2)根据属性创建 DLedgerServer
在这里插入图片描述
(3)启动DLedgerServer
启动一系列服务(以下服务的内容待更新)
在这里插入图片描述

①存储:启动线程flushData和cleanSpace
②RPC:默认启动了两个Netty的客户端与服务端 (实现双向通信)
在这里插入图片描述
③推送:
在这里插入图片描述
④选举:获取角色
在这里插入图片描述
⑤定时任务:每秒执行一次checkPreferredLeader
单程线程线程池,里面是一个守护线程,进行

(4)添加优雅停止的钩子
在这里插入图片描述
(三)钩子函数
关闭方式有三种:

正常关闭:当最后一个非守护线程结束 / 调用了System.exit / 通过其他特定平台关闭(发送SIGINT,SIGTERM信号等)
强制关闭:调用Runtime.halt方法 / 直接kill JVM进程(发送SIGKILL信号)
异常关闭:运行中遇到RuntimeException异常等。

shutdown钩子函数使用案例

Thread thread1 = new Thread(() -> System.out.println("thread1..."));

// 定义关闭线程
Thread shutdownThread = new Thread(() -> System.out.println("shutdownThread..."));

// jvm关闭的时候先执行该线程钩子
Runtime.getRuntime().addShutdownHook(shutdownThread);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

机智的路易

用爱发电是走不远的

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值