你还不会Dubbo集群容错?源码实现其实很简单

Dubbo 集群容错

关于Dubbo的集群容错策略以及各自的使用场景,这个常见的面试题相信大家并不陌生。

本文带大家一起看看几种集群的源码实现。

看本文之前可能需要看之前文章

Dubbo 源码学习 | 消费端引用梳理

Dubbo 源码持续学习 Directory

Cluster 接口

集群的作用 : 当服务目录Directory有多个服务提供方时,需要将多个服务提供方组织成一个集群,并伪装成一个提供方(Invoker)

Cluster 接口方法定义,前面文章已经介绍了 服务消费者引用调用了创建代理对象时 cluster.join 方法将服务目录的Invokers 列表伪装成一个Invoker 。然后内部进行负载均衡算法、集群容错处理,本文继续深入一探究竟。

   @Adaptive
    <T> Invoker<T> join(Directory<T> directory) throws RpcException;
    

AbstractCluster & AbstractClusterInvoker 模版类

AbstractCluster

AbstractCluster.join 方法在doJoin 基础上增加拦截器,先忽略拦截器。

doJoin 是一个抽象的方法具体有子类实现,返回AbstractClusterInvoker

    @Override
    public <T> Invoker<T> join(Directory<T> directory) throws RpcException {
        return buildClusterInterceptors(doJoin(directory), directory.getUrl().getParameter(REFERENCE_INTERCEPTOR_KEY));
    }
    
    protected abstract <T> AbstractClusterInvoker<T> doJoin(Directory<T> directory) throws RpcException;

AbstractClusterInvoker

invoker 方法处理业务逻辑方法模板方法核心逻辑:

加载对应负载均衡算法(LoadBalance)这里并没有调用负载均衡算法选择一个invoker,虽然AbstractClusterInvoker已经 实现逻辑select / reselect ,调用负载均衡算法选择一个invoker 是在子类中处理的。

子类需要实现doInvoke,doInvoke需要完成的逻辑

  • 根据负载均衡算法选择一个服务提供者进行调用

  • 调用出错会进行对应的相应的处理也就是集群容错机制。

    public Result invoke(final Invocation invocation) throws RpcException {
        checkWhetherDestroyed();

        // binding attachments into invocation.
        Map<String, Object> contextAttachments = RpcContext.getContext().getObjectAttachments();
        if (contextAttachments != null && contextAttachments.size() != 0) {
            ((RpcInvocation) invocation).addObjectAttachments(contextAttachments);
        }

        List<Invoker<T>> invokers = list(invocation);
        LoadBalance loadbalance = initLoadBalance(invokers, invocation);
        RpcUtils.attachInvocationIdIfAsync(getUrl(), invocation);
        return doInvoke(invocation, invokers, loadbalance);
    }

FailfastCluster

快速失败,也就是失败抛出异常,适用于非幂等的操作。代码实现很简单,返回一个 FailfastClusterInvoker,FailfastClusterInvoker逻辑也很简单:

  • 调用负载均衡算法选择一个服务提供者

  • 发生异常直接抛出异常

图片

图片

FailoverCluster

这是默认的集群策略,失败会重试其它服务器,需要配置指定一个重试次数(默认值2),一般用于读操作,如果写操作注意控制幂等,否则超时也可能导致重复数据。如果重试次数设置为0,效果等同于FailfastCluster快速失败。

代码核心逻辑:

  • 最多循环调用 重试次数+1次

  • 调用成功则返回结果

  • 如果调用失败则在未选择的服务提供者中重新选择一个进行远程调用 当前已经选择了的服务提供者列表会加入到 invoked中,下次select 优先选择未选择的。

  • 超过重试次数会保存

图片

FailsafeCluster

失败安全:远程调用会返回空值,通常用于写入审计日志等操作,失败也不会影响业务流程。

图片

FailbackCluster

失败重试。失败了会被加入到失败列表,稍候通过定时任务重试。通常用于对实时性要求不高但需要保证最终一致性的场景,如消息通知。

与FailoverCluster重试不同,它不是立即重试,而是使用内置的HashedWheelTimer进行定时触发。

图片

Forking Cluster

并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但会消耗较多服务器资源。

使用方式需要配置最大并行数(例如forks="2")

实现原理:并行异步调用,一旦返回结果放入BlockingQueue中。主线程一旦从BlockingQueue拿到结果或者异常,就立即返回。(其他几个异步调用结果就被忽略了,因此会造成资源浪费

图片

Broadcast Cluster

广播调用所有提供者,逐个调用,任意一台报错则报错。通常用于需要更新所有提供者状态的场景,如缓存更新

图片

总结

本文主要介绍了常见的集群容错策略,代码也很清晰简单,一般情况主要考虑幂等,是否需要进行重试。

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值