当前位置: 首页 > news >正文

【025】Dubbo3从0到1系列之Dubbo注册中心重试机制 - 实践

文章目录

  • Dubbo3注册中心重试机制
  • 四、重试机制
    • 4.1 设计核心
    • 4.2 FailbackRegistry
      • 4.2.1 重试机制原理
        • ✅ 1. 基本概念
        • ✅ 2. 核心组件
      • 4.2.2 核心字段
      • 4.2.3 核心源码分析
        • 1. 初始化流程
        • 2. 失败任务添加流程
        • 3. 重试执行流程

Dubbo3注册中心重试机制

四、重试机制

在真实的微服务系统中,Nacos、ZooKeeper、etcd 等服务发现组件一般会独立部署成一个集群,业务服务通过网络连接这些服务发现节点,完成注册和订阅操作。

但即使是机房内部的稳定网络,也无法保证两个节点之间的请求一定成功,因此 Dubbo 这类 RPC 框架在稳定性和容错性方面,就受到了比较大的挑战。为了保证服务的可靠性,重试机制就变得必不可少了

4.1 设计核心

AbstractRegistry 中的 register()/unregister()、subscribe()/unsubscribe() 以及 notify() 等核心操作,详细分析了通过本地缓存实现的容错功能。其实,这几个核心方法同样也是重试机制的关注点。

dubbo-registry 将重试机制的相关实现放到了 AbstractRegistry 的子类—— FailbackRegistry 中

在这里插入图片描述

4.2 FailbackRegistry

FailbackRegistry 是 Dubbo 中一个重要的注册中心抽象实现,它提供了失败自动重试的功能。

4.2.1 重试机制原理

✅ 1. 基本概念

Dubbo 注册中心的重试机制是为了解决在网络不稳定或注册中心临时不可用的情况下,服务注册与订阅操作失败的问题。当这些操作失败时,Dubbo 不会立即抛出异常,而是将失败的任务记录下来,并定期尝试重新执行。

✅ 2. 核心组件
  • HashedWheelTimer: 使用时间轮算法实现定时调度任务,用于周期性地触发重试逻辑。
  • 四个失败任务映射表:
    • failedRegistered: 记录注册失败的任务
    • failedUnregistered: 记录取消注册失败的任务
    • failedSubscribed: 记录订阅失败的任务
    • failedUnsubscribed: 记录取消订阅失败的任务

4.2.2 核心字段

✅ 1. retryTimer, 在构造方法当中进行初始化, 用于定时执行失败重试操作的时间轮。

private final HashedWheelTimer retryTimer;

✅ 2. retryPeriod, 重试操作的时间间隔

private final int retryPeriod;

✅ 3. failedRegistered, 注册失败的 URL 集合,其中 Key 是注册失败的 URL,Value 是对应的重试任务。

private final ConcurrentMap<URL, FailedRegisteredTask> failedRegistered = new ConcurrentHashMap<>();

✅ 4. failedUnregistered, 取消注册失败的 URL 集合,其中 Key 是取消注册失败的 URL,Value 是对应的重试任务。

private final ConcurrentMap<URL, FailedUnregisteredTask> failedUnregistered = new ConcurrentHashMap<>();

✅ 5. failedSubscribed, 订阅失败 URL 集合,其中 Key 是订阅失败的 URL + Listener 集合,Value 是相应的重试任务。

private final ConcurrentMap<Holder, FailedSubscribedTask> failedSubscribed = new ConcurrentHashMap<>();

✅ 6. failedUnsubscribed, 取消订阅失败的 URL 集合,其中 Key 是取消订阅失败的 URL + Listener 集合,Value 是相应的重试任务。

private final ConcurrentMap<Holder, FailedUnsubscribedTask> failedUnsubscribed = new ConcurrentHashMap<>();

4.2.3 核心源码分析

1. 初始化流程

通过构造方法进行初始化操作

public FailbackRegistry(URL url) {
super(url);
this.retryPeriod = url.getParameter(REGISTRY_RETRY_PERIOD_KEY, DEFAULT_REGISTRY_RETRY_PERIOD);
// since the retry task will not be very much. 128 ticks is enough.
retryTimer = new HashedWheelTimer(
new NamedThreadFactory("DubboRegistryRetryTimer", true), retryPeriod, TimeUnit.MILLISECONDS, 128);
}
  • 初始化过程中创建了一个基于时间轮的定时器 retryTimer,并设置了默认的重试间隔(通常是5秒)。
2. 失败任务添加流程

这里以注册为例进行说明

private void addFailedRegistered(URL url) {
FailedRegisteredTask oldOne = failedRegistered.get(url);
if (oldOne != null) {
return;
}
FailedRegisteredTask newTask = new FailedRegisteredTask(url, this);
oldOne = failedRegistered.putIfAbsent(url, newTask);
if (oldOne == null) {
// never has a retry task. then start a new task for retry.
retryTimer.newTimeout(newTask, retryPeriod, TimeUnit.MILLISECONDS);
}
}
  • 这段代码展示了如何向失败队列中添加新的注册失败任务,并启动定时重试。
3. 重试执行流程

每个具体的重试任务如 FailedRegisteredTask 都实现了 TimerTask 接口,在指定的时间后会被调用;

  • FailedRegisteredTask
public final class FailedRegisteredTask extends AbstractRetryTask {
private static final String NAME = "retry register";
public FailedRegisteredTask(URL url, FailbackRegistry registry) {
super(url, registry, NAME);
}
@Override
protected void doRetry(URL url, FailbackRegistry registry, Timeout timeout) {
registry.doRegister(url);
registry.removeFailedRegisteredTask(url);
}
}

在这里插入图片描述

  • AbstractRetryTask类中
@Override
public void run(Timeout timeout) throws Exception {
if (timeout.isCancelled() || timeout.timer().isStop() || isCancel()) {
// other thread cancel this timeout or stop the timer.
return;
}
if (retryTimes > 0 && times > retryTimes) {
// 1-13 - failed to execute the retrying task.
return;
}
try {
// 模板方法,由子类去实现, 这里是FailedRegisteredTask类
doRetry(url, registry, timeout);
} catch (Throwable t) {
// 忽略了所有异常,尝试重试
// Ignore all the exceptions and wait for the next retry
reput(timeout, retryPeriod);
}
}
protected abstract void doRetry(URL url, FailbackRegistry registry, Timeout timeout);

FailedRegisteredTask类中重写了doRegry方法,其逻辑为:

@Override
protected void doRetry(URL url, FailbackRegistry registry, Timeout timeout) {
registry.doRegister(url); // 重新注册
registry.removeFailedRegisteredTask(url); // 从失败列表当中移除对应的任务
}
  • 一旦成功完成操作,就从失败列表中移除对应的任务;如果再次失败,则会继续保留在失败列表中等待下次重试。
http://www.gsyq.cn/news/67457.html

相关文章:

  • 3步搞定拉转推!EasyGBS新插件上线,摄像头秒变直播源!
  • 2025年江西十大智能出入口解决方案企业推荐,百胜智能靠谱企
  • 2025年下半年内蒙古承载力检测服务商Top5推荐指南
  • 2025年特种工业泵供应商权威推荐榜单:工业泵/充填工业泵/耐磨泵源头厂家精选
  • 如何用 vxe-table 实现粘贴数据自动进入新增行与新增列,数据无限扩充
  • 2025成都全包装修权威推荐,资质服务双优,装修/整装/家装/房屋装修品牌选择指南
  • 10418_基于SSM的旅游管理系统
  • 2025年广州儿童黄埔军校夏令营学校权威推荐榜单:广州黄埔军校夏令营招生服务商/广州小学生黄埔军校军事夏令营培训/广州黄埔军校军事夏令营公司精选
  • 深度揭秘:湖南省网安基地——由“安服公司”开的网络安全培训班,到底是坑还是宝藏?​ - 指南
  • 百度不收录境外服务器是真是假?
  • Rust自定义迭代器
  • 适合幼儿园开展的STEM课程品牌介绍及分析
  • 分库分表全面总结
  • 2025年中国十大网店代运营公司推荐:代运营哪家强?
  • 2025年户外橡胶地垫制造厂权威推荐榜单:减震橡胶地垫/公园橡胶地垫/复合橡胶地垫源头厂家精选
  • 靠谱的国际短信验证码平台,短信验证码服务商盘点,兼顾速度、安全与成本控制!
  • 【JPCS出版 | EI检索】第七届国际科技创新学术交流大会暨机械工程与自动化国际学术会议(MEA 2025)
  • JavaScript基础笔记碎片-对象、数组、Map与Set
  • 数字屋打包流程
  • 2025年12月优质螺栓厂家电话精选:外六角螺栓/U型螺栓/地脚螺栓/预埋螺栓厂家联系方式 + 实用选择指南建筑 / 工业用螺栓选型参考
  • 2025年下半年工业风扇工厂综合推荐指南:十佳厂家全方位解析
  • jkd和notepad++
  • 开源了我的第一个 Chrome 扩展:CNB Workspace Manager
  • 护手霜挑选必备指南:2025十大防干裂品牌深度剖析!持久保湿滋润呵护双手
  • 如何在Stimulsoft图表中创建自动系列(Auto Series)——实战示例解析
  • 2025年度裁断机厂商排名,裁断机厂家哪家售后好
  • xxl-job打包出现Could not determine gpg version异常
  • 冰蓝科技正式发布全新纯前端文档编辑产品 —— Spire.WordJS
  • 第一天敏捷冲刺博客
  • 2025年北京天津河北上海江苏印刷精品定制公司推荐:专业的印