集群容错

转载自:https://blog.youkuaiyun.com/qq924862077/article/details/79711349

  
  在集群调用失败时,Dubbo 提供了多种容错方案,缺省为 failover 重试。接口如下:

@SPI(FailoverCluster.NAME) //默认使用failOver模式
public interface Cluster {
 
    /**
     * Merge the directory invokers to a virtual invoker.
     *
     * @param <T>
     * @param directory
     * @return cluster invoker
     * @throws RpcException
     */
    @Adaptive
    <T> Invoker<T> join(Directory<T> directory) throws RpcException;
 
}

  这里的 Invoker 是 Provider 的一个可调用 Service 的抽象,Invoker 封装了 Provider 地址及 Service 接口信息,Directory 代表多个 Invoker,可以把它看成 List ,但与 List 不同的是,它的值可能是动态变化的,比如注册中心推送变更
Cluster 将 Directory 中的多个 Invoker 伪装成一个 Invoker,对上层透明,伪装过程包含了容错逻辑,调用失败后,重试另一个。
  Router 负责从多个 Invoker 中按路由规则选出子集,比如读写分离,应用隔离等。LoadBalance 负责从多个 Invoker 中选出具体的一个用于本次调用,选的过程包含了负载均衡算法,调用失败后,需要重选。

  集群容错模式有:

  • Failover Cluster:失败自动切换,当出现失败,重试其它服务器。
  • Failfast Cluster:快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。
  • Failsafe Cluster:失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。
  • Failback Cluster:失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。
  • Forking Cluster:并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。
  • Broadcast Cluster广播调用所有提供者,逐个调用,任意一台报错则报错 。通常用于通知所有提供者更新缓存或日志等本地资源信息。

  集群模式配置:
  按照以下示例在服务提供方和消费方配置集群模式

<dubbo:service cluster="failsafe" />

<dubbo:reference cluster="failsafe" />
### Dubbo集群容错机制及其实现方式 #### 什么是Dubbo集群容错? Dubbo 中的集群容错是指在分布式环境中,当消费者调用提供者集群时发生异常的情况下,通过预定义的策略来处理这些异常并保障系统的高可用性。这种机制对于构建健壮的微服务架构至关重要[^1]。 #### Dubbo内置的容错策略 Dubbo 提供了六种主要的集群容错方案,每一种都适用于特定的业务场景: 1. **Failover Cluster(失败自动切换)** 这是 Dubbo 的默认容错策略。在这种模式下,如果某个节点调用失败,则会重新尝试其他节点直到成功或者达到最大重试次数为止。此方法适合于幂等操作,即多次执行不会改变结果的操作[^4]。 2. **Failfast Cluster(快速失败)** 当请求发送到服务器端后立即返回错误给客户端而不再做任何额外的努力去联系其它实例。这种方式可以减少延迟时间,在某些情况下可能更优[^3]。 3. **Failsafe Cluster(安全失败)** 即使出现异常也只会记录日志而不抛出异常至上层应用逻辑中;它通常用于后台更新或统计类非核心功能模块里[^5]。 4. **Failback Cluster(失败备选)** 如果初次尝试失败则会被放入队列稍后再试一次。这有助于缓解瞬态负载高峰期间的压力。 5. **Forking Cluster(并行调用多个服务器)** 同时向多台机器发起请求并将第一个成功的响应作为最终答案反馈回来。虽然提高了速度但也增加了资源消耗风险. 6. **Broadcast Cluster(广播所有提供者)** 将消息分发给所有的服务提供方而不是单一目标地址。这对于通知型接口特别有用,比如缓存清除命令传播等等. #### 如何选择合适的容错策略? 选择哪种具体的容错策略取决于实际的应用场景以及性能考量因素,例如是否允许重复提交、能否接受较高的延时等问题都需要综合评估之后再决定采用哪一类最佳实践. 下面给出一段简单的代码示例展示如何设置 failover 容错: ```java <dubbo:service interface="com.example.MyService" cluster="failover"/> ``` 上述XML片段展示了如何指定 `MyService` 使用的是 `failover` 类型的集群管理器来进行容错控制。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值