← 返回题目列表

Dubbo 有哪些集群容错策略?

高频 中等 第 5 / 25 题 更新于 2026/07/28
RPCDubbo容错Failover

简化版

Dubbo 的集群容错策略决定「调用某个提供者失败时怎么办」,内置几种:① Failover(失败自动切换,默认)——失败后自动重试其他提供者,适合读操作(幂等),但重试有次数限制;② Failfast(快速失败)——失败立即报错、不重试,适合非幂等的写操作(如新增记录,重试会重复);③ Failsafe(失败安全)——失败直接忽略、只记日志,适合可有可无的操作(如记录日志、监控埋点);④ Failback(失败自动恢复)——失败后记录,定时重发,适合消息通知类;⑤ Forking(并行调用)——同时调多个,只要一个成功就返回,适合实时性要求高、不惜资源的读;⑥ Broadcast(广播)——逐个调用所有提供者,适合通知所有节点更新。

详细版

六种容错策略:

策略行为适用场景
Failover(默认)失败重试其他节点(默认重试 2 次)读操作、幂等调用
Failfast失败立即报错,不重试非幂等写操作(新增)
Failsafe失败忽略,记日志可失败的操作(日志、监控)
Failback失败记录,定时重发消息通知、最终一致
Forking并行调多个,一个成功即返回实时性高、成本不敏感的读
Broadcast逐个调所有节点,任一失败则失败通知所有提供者(如刷新缓存)

配置:

@DubboReference(cluster = "failfast", retries = 0)
private OrderService orderService;

关键:Failover 的重试次数用 retries 配置(默认 2,即总共调用 3 次);写操作要用 Failfast 避免重试导致数据重复。

完整版教学

一、集群容错要解决什么

Consumer 调用某个 Provider 时,可能失败——网络抖动、Provider 宕机、超时、业务异常。集群容错策略决定的就是:当一次调用失败时,Dubbo 该怎么处理——是重试其他节点、还是立即报错、还是忽略。选对策略很重要,尤其要区分读操作(可重试)和写操作(重试可能重复)。Dubbo 在集群层(Cluster)封装了多种容错策略。

二、Failover:失败自动切换(默认)

Failover(失败自动切换) 是 Dubbo 的默认策略:调用一个 Provider 失败后,自动重试列表里的其他 Provider,直到成功或达到重试上限。

  • 重试次数:用 retries 配置,默认 2——注意这是「重试次数」,加上第一次调用,总共最多调用 3 次(1 次原始 + 2 次重试)。
  • 适用读操作、幂等操作。因为读/幂等操作重试多次结果一样,重试能提高成功率、屏蔽个别节点故障。
  • 不适用非幂等的写操作!比如「新增订单」,如果第一次其实成功了但响应超时,Failover 重试会再新增一条,导致数据重复。所以写操作绝不能用默认的 Failover(要么用 Failfast,要么保证幂等)。

三、Failfast:快速失败

Failfast(快速失败):调用失败后立即抛出异常、不重试

  • 适用非幂等的写操作——新增记录、扣款等不能重复执行的操作。失败就失败,交给上层处理,绝不重试以免重复。
  • 这是写操作的常用容错策略(配合 retries=0)。

四、Failsafe 与 Failback:容忍失败

Failsafe(失败安全):调用失败后直接忽略,只记录日志,不抛异常、不影响主流程。

  • 适用可有可无、失败无所谓的操作——如记录审计日志、监控埋点。这些失败了不该影响核心业务,所以「安全地忽略」。

Failback(失败自动恢复):调用失败后记录下来,后台定时重发

  • 适用消息通知类、允许延迟的最终一致场景。失败不立即报错,而是稍后自动重试补偿。

五、Forking 与 Broadcast:并行与广播

Forking(并行调用)同时调用多个 Provider,只要有一个成功就立即返回(其他的结果忽略)。

  • 适用实时性要求高、但不惜消耗资源的读操作。并行调多个,取最快返回的,降低延迟、提高成功率。代价是消耗更多资源(一次逻辑调用产生多次实际调用),可用 forks 参数控制并行数。

Broadcast(广播调用)逐个调用所有 Provider,任意一个失败则整体失败

  • 适用:需要通知所有提供者执行某操作的场景——比如通知所有节点刷新本地缓存、更新配置。要求每个节点都执行到,所以逐个都调。

六、常见误区与追问

这道题面试时最容易丢分的地方,是把「Dubbo 集群容错」答成一段泛泛的组件介绍。更稳的答法是先给结论,再沿着 远程调用链路 拆清楚流程,最后补上异常场景、数字边界和选型取舍。

回答层次要讲清的内容容易漏掉的边界
核心定义Dubbo 集群容错定义一次调用失败后如何处理,常见有 Failover、Failfast、Failsafe、Failback、Forking、Broadcast不要停在名词解释
流程机制选中 Invoker 发起调用 -> 调用超时或异常 -> Cluster 策略判断处理方式 -> 重试其他节点或直接失败 -> 返回结果或降级说明谁触发、谁存储、谁通知、谁兜底
工程取舍查询接口可 Failover 重试 2 次,扣款或下单接口通常避免自动重试,防止重复写RPC 让调用写法像本地方法,但失败语义、网络延迟和版本兼容必须按远程系统处理
Dubbo 集群容错 面试拆解:
1. 选中 Invoker 发起调用
2. 调用超时或异常
3. Cluster 策略判断处理方式
4. 重试其他节点或直接失败
5. 返回结果或降级

记忆钩子:先拆代理、序列化、传输、寻址、容错,再说明超时、重试、幂等这些工程边界;回答时一定要落到题目中的「Dubbo 集群容错」,不要把相邻中间件的能力混着讲。

  • 误区:失败后重试总是最安全。 写操作重试可能造成重复下单、重复扣款,必须先保证幂等。
  • 误区:Failfast 是不可靠。 Failfast 适合非幂等写操作,快速暴露错误比盲目重试更安全。
  • 误区:Broadcast 适合普通查询。 Broadcast 会调用所有提供者,常用于通知或缓存刷新,不适合高频普通查询。
  • 追问:Failover 适合什么场景? 适合读操作或幂等操作,失败后切换其他实例重试。
  • 追问:Failback 和 Failsafe 区别是什么? Failback 后台记录失败并定时重试,Failsafe 直接忽略异常返回。
  • 追问:容错策略和超时怎么配合? 总耗时约等于单次超时乘以尝试次数,所以重试次数不能随意加。

七、加强记忆

Dubbo 集群容错决定「调用失败怎么办」:① Failover(默认)——重试其他节点retries 默认 2,共 3 次),适合读/幂等写操作禁用(重试会重复);② Failfast——立即报错不重试,适合非幂等写(新增/扣款);③ Failsafe——忽略失败记日志,适合日志/监控等可失败操作;④ Failback——失败记录、定时重发,适合消息通知/最终一致;⑤ Forking——并行调多个、一个成功即返回,适合实时性高不惜资源的读;⑥ Broadcast——逐个调所有节点,适合通知全部节点刷新缓存/配置。核心区分:读用 Failover(可重试)、写用 Failfast(防重复);记忆口诀:Failover 重试、Failfast 快挂、Failsafe 忽略、Failback 补偿、Forking 并行取快、Broadcast 通知全部