孤舟笔记 互联网常用框架篇二 Dubbo服务请求失败怎么处理?集群容错策略你用过几种

文章目录

个人网站

分布式系统中,服务调用失败是 家常便饭 ------网络抖动、服务重启、机房故障......问题不是"会不会失败",而是"失败了怎么办"。Dubbo 提供了多种集群容错策略,面试官问这题,他想听的是:每种策略的原理是什么?适用什么场景?你项目里用的哪种?

先说结论

策略 行为 适用场景
Failover 失败自动切换其他提供者重试 读操作(默认)
Failfast 失败立即报错 非幂等写操作
Failsafe 失败忽略,返回空结果 日志等非关键操作
Failback 失败自动记录,定时重发 消息通知等最终一致场景
Forking 并行调用多个,取最快返回 实时性要求高的读操作
Broadcast 逐个调用所有提供者 通知所有节点更新缓存

一句话记住:Failover 是"换家店试试",Failfast 是"不行就算了",Failsafe 是"忘了这事",Failback 是"回头再说"

Failover:换家店试试

默认策略。调用失败后,自动切换到其他提供者重试。默认重试 2 次(共调用 3 次)。

java 复制代码
@DubboReference(retries = 2)  // 👈 失败重试 2 次,总共调用 3 次
private UserService userService;
yaml 复制代码
dubbo:
  consumer:
    retries: 2  # 全局默认重试次数

就像你去餐厅点菜,第一家说"售完了",你自动换第二家点------总有一家能做。

注意 :重试会带来 延迟 (每次超时等一段时间),也可能导致 重复写入 (如果是写操作)。所以 Failover 只适合读操作,写操作必须用 Failfast。

Failfast:不行就算了

只调用一次,失败立即报错,不重试。

java 复制代码
@DubboReference(cluster = "failfast")  // 👈 失败直接抛异常
private OrderService orderService;

适合 非幂等写操作------创建订单、扣款等。重试可能导致重复下单,比失败更可怕。

就像医院挂号------挂不上就挂不上,你不能自动换家医院挂号,因为可能挂重了。

Failsafe:忘了这事

调用失败时忽略异常,返回空结果。

java 复制代码
@DubboReference(cluster = "failsafe")
private LogService logService;

适合 非关键操作------写日志、发通知、更新缓存等。失败了不影响主流程。

就像你在饭馆吃饭,服务员忘了送小菜------无所谓,不影响吃主菜。

Failback:回头再说

调用失败时,记录请求到失败队列,定时重发

java 复制代码
@DubboReference(cluster = "failback")
private NotificationService notificationService;

适合 最终一致性场景------消息通知、数据同步等。失败了不急着重试,后台慢慢补。

就像快递送不到------先放快递柜,回头再来取。Dubbo 默认每 5 秒重试一次失败记录。

注意:如果失败请求堆积太多,可能导致内存溢出。生产环境需监控失败队列长度。

Forking:同时点几家

同时调用多个提供者,取最快返回的那个

java 复制代码
@DubboReference(cluster = "forking", forks = 3)  // 👈 并行调用 3 个
private SearchService searchService;

适合 实时性要求高 的读操作------搜索引擎、推荐系统等。不追求所有结果,谁最快用谁。

就像你同时叫了 3 辆出租车,谁先到坐谁------快就是正义。

注意:并行调用会浪费服务器资源(3 次调用只有 1 次有效),forks 数量不宜过大。

Broadcast:通知所有人

逐个调用所有提供者,任意一个报错则报错。

java 复制代码
@DubboReference(cluster = "broadcast")
private CacheService cacheService;

适合 通知所有节点 的场景------更新缓存、刷新配置等。每个节点都得通知到。

就像公司广播------通知所有部门开会,不能漏掉任何一个。

怎么选择

操作类型 推荐策略 原因
读操作 Failover 天然幂等,重试安全
写操作(非幂等) Failfast 避免重复写入
非关键操作 Failsafe 失败不影响主流程
消息通知 Failback 最终一致即可
实时性要求高 Forking 并行取最快
全节点通知 Broadcast 每个都得通知
复制代码
Dubbo 集群容错全景

六种策略
├── Failover ------ 失败重试(默认,适合读)
├── Failfast ------ 快速失败(适合非幂等写)
├── Failsafe ------ 安全失败(适合非关键操作)
├── Failback ------ 失败重发(适合最终一致)
├── Forking ------ 并行调用(适合实时读)
└── Broadcast ------ 广播调用(适合全节点通知)

选择原则
├── 读操作 → Failover
├── 写操作 → Failfast
├── 非关键 → Failsafe
├── 通知类 → Failback / Broadcast
└── 实时性 → Forking

核心风险
├── Failover 重试导致写重复
├── Failback 失败队列堆积
└── Forking 并行浪费资源

口诀:Failover换家试,Failfast直接报;
      Failsafe无所谓,Failback回头搞;
      Forking并行跑,Broadcast全员到;
      读写区分最关键,幂等重试才安全

回答技巧与点评

标准回答:Dubbo 提供 6 种集群容错策略:Failover(失败自动重试,默认,适合读操作)、Failfast(快速失败,适合非幂等写操作)、Failsafe(忽略异常,适合非关键操作)、Failback(失败定时重发,适合最终一致场景)、Forking(并行调用取最快,适合实时读)、Broadcast(广播调用所有节点,适合通知类操作)。选择的关键在于区分读写操作和幂等性。

加分回答

  1. 幂等性是重试的前提:Failover 重试意味着同一请求可能被多次执行,只有读操作和幂等写操作才能安全重试。非幂等写操作(如下单、扣款)必须用 Failfast
  2. retries 的计算:retries=2 表示失败后重试 2 次,总共调用 3 次(1 次正常 + 2 次重试)。超时时间要合理设置,避免重试导致响应时间成倍增加
  3. 自定义容错策略:Dubbo 通过 SPI 机制支持自定义 Cluster 实现,你可以根据业务需求实现自己的容错逻辑,比如"失败后降级到缓存"的混合策略

面试官点评

这道题考的是你对 分布式容错设计 的理解。能说出 3-4 种策略算及格,高分的关键在于:讲清楚每种策略的适用场景和风险,特别是 Failover 重试可能导致写重复的问题。如果你能提到幂等性是重试的前提,说明你有实战经验。

原文阅读


内容有帮助?点赞、收藏、关注三连!评论区等你 💪

相关推荐
落魄江湖行17 小时前
孤舟笔记 Spring全家桶篇二十五 谈谈EurekaServer数据同步原理?注册中心怎么保证数据一致性
春招·孤舟笔记·谈谈eurekaserver数
落魄江湖行17 小时前
孤舟笔记 互联网常用框架篇三 Dubbo是如何动态感知服务下线的?注册中心和服务端双保险
春招·孤舟笔记·dubbo是如何动态感知服务下
落魄江湖行17 天前
孤舟笔记 IO 与网络编程篇三 IO和NIO的区别是什么?从阻塞到非阻塞的范式革命
春招·孤舟笔记·io和nio的区别
落魄江湖行22 天前
孤舟笔记 并发篇十八 为什么启动线程不能直接调用run()方法?调用两次start()又会怎样?这个设计藏着大智慧
thread·java并发·春招·孤舟笔记
逻辑驱动的ken22 天前
Java高频面试考点场景题22
java·开发语言·jvm·面试·职场和发展·求职招聘·春招
落魄江湖行22 天前
孤舟笔记 并发篇二十九 volatile关键字有什么用?它的实现原理是什么?面试必问的轻量级同步机制
java并发·春招·孤舟笔记·volatile关键字
落魄江湖行23 天前
孤舟笔记 并发篇二十八 wait和sleep是否会触发锁的释放及CPU资源的释放?这个区别面试必考
java并发·春招·孤舟笔记·wait和sleep
落魄江湖行23 天前
孤舟笔记 并发篇二十二 线程池是如何回收线程的?核心线程和非核心线程的回收逻辑大不相同
java并发·春招·孤舟笔记·线程池是如何回收线程的
落魄江湖行24 天前
孤舟笔记 并发篇二十五 当任务数超过核心线程数时,如何让任务不进入队列?线程池调优的经典问题
java并发·春招·孤舟笔记·当任务数超过核心线程数时