4.Cluster

本文涉及的产品
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
简介: 本文深入解析Dubbo集群容错机制,围绕Cluster核心概念,结合Directory、Router、LoadBalance,详解其如何将多个Invoker伪装为单一入口并实现容错。重点剖析9种Cluster实现类:如Failover(失败重试)、Failfast(快速失败)、Forking(并行调用)、Broadcast(广播调用)等,分别适用于读写场景、通知更新、日志记录等不同业务需求。通过源码逻辑与流程图结合,揭示各策略内部实现机制及适用场景,帮助开发者合理配置容错策略,提升系统稳定性与性能。

我们再来回顾一下官网的对于集群容错的架构设计图
图片加载失败
从标题看就知道本篇主要讲的就是Cluster了,之前我反复强调三个关键词Directory,Router,LoadBalance,但是换个角度而言,其实也可以是四个关键词,还有一个就是Cluster
首先我们先看看官网的介绍,这个Cluster到底是干嘛的
Cluster 将 Directory 中的多个 Invoker 伪装成一个 Invoker,对上层透明,伪装过程包含了容错逻辑,调用失败后,重试另一个
简单来说,就是应对出错情况采取的策略,当然这么说还是有些不准确的.那我们再来看看这个接口及其继承体系图
图片加载失败
看继承体系图中,我们也可以看到了他有9个实现类,换个角度来说,就是有9中应对策略,下面的逐一简介和分析其内部实现(以下逻辑都在Cluster接口的join方法)
MergeableCluster
这个主要用在分组聚合中,我们来看一下官网的介绍
按组合并返回结果 ,比如菜单服务,接口一样,但有多种实现,用group区分,现在消费方需从每种group中调用一次返回结果,合并结果返回,这样就可以实现聚合菜单项。
该类的源码是这么多实现类中最多的.代码全部贴出来篇幅就太大了,我用一个流程图来告诉大家这个类是干什么的
图片加载失败
大家可以根据我这个流程图对照源码理一下思路,这三个判断也是很容易看出来的,比如
URL中merger属性是否有值
是否指定合并方法merger.startsWith("."),为什么是否指定方法是这么判断的呢?因为指定合并方法在xml配置中就是要以"."开头,例如:
是否默认merge策略:
其实这个`ConfigUtils.isDefault从我们使用上都可以推断出他的实现:
AvailableCluster
从单词Available意思就知道,这个是调用可用的.代码实现逻辑也比较简单
图片加载失败
源码的这个写法是比较优雅的,遍历所有的Invokers判断invoker.isAvalible,只要一个有为true直接调用返回,否则就抛出异常。
在2.7.0中升级如下:
ForkingCluster
引用官网的介绍
并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks="2" 来设置最大并行数。
我们来看看源码的实现
图片加载失败
这里就涉及到了线程池,但是由于本篇篇幅会很大,所以线程池的会专门有个专题来讲,可以继续简书关注肥朝
至于这个execute方法是干嘛的,这个时候可以用上码农日常工具推荐里面介绍的Dash
图片加载失败
FailfastCluster
引用官网的介绍
快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。
看看源码实现
图片加载失败
这个的实现应该是实现类里面最简单的,就是调用invoke,调用失败就抛出异常,但是这个却是面试问得最多的,请留意后面的面试题。
MockClusterWrapper
这个主要用在本地伪装上,让我们来看官网描述
本地伪装通常用于服务降级,比如某验权服务,当服务提供方全部挂掉后,客户端不抛出异常,而是通过 Mock 数据返回授权失败
同样我也用一个流程图来描述他的逻辑
图片加载失败
图片加载失败
FailoverCluster
这个是本篇的重点,也是dubbo里面容错方案的缺省值.让我们来看官网介绍
失败自动切换,当出现失败,重试其它服务器。通常用于读操作,但重试会带来更长延迟。可通过 retries="2" 来设置重试次数(不含第一次)
也就是说,默认的情况下,如果第一次调用失败,会重试两次,也就是一共是调用三次.所以len = 3的(经过调试确实是3).
图片加载失败
这个时候面试题就来了,注意我上面提到的FailfastCluster,面试会问:
dubbo中"读接口"和"写接口"有什么区别?答案也是很明显的,因为默认FailoverCluster会重试,如果是"写"类型的接口,如果在网络抖动情况下写入多个值,所以"写"类型的接口要换成FailfastCluster
FailbackCluster
老规矩看官网
失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。
图片加载失败
这个定时重发的逻辑如下,由于还是涉及到线程池,这个必须要有些知识铺垫,后面会讲解,简书关注肥朝即可,不过我们可以先看一下api文档。
图片加载失败
图片加载失败
FailsafeCluster
继续看官网介绍,我反复强调官网介绍,其实也是在回答前面的"怎么看源码"这个问题
失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。
这个的逻辑就很简单了,官网的这句话就已经介绍完了
图片加载失败
BroadcastCluster
老规矩,还是官网介绍
广播调用所有提供者,逐个调用,任意一台报错则报错。通常用于通知所有提供者更新缓存或日志等本地资源信息。
图片加载失败
这个的逻辑也是很简单,遍历所有Invokers, 逐个调用每个调用,有异常就catch,以免影响到剩下的调用,那这个和AvailableCluster有什么区别?当然有啊,你仔细看就知道,BroadcastCluster是要遍历调用完全部的invoker,而AvailableCluster是只要有一个调用就return了.

相关文章
|
1月前
|
开发框架 移动开发 安全
电竞护航系统游戏俱乐部软件电竞游戏陪练源码/搭建自己的平台、打手俱乐部、游戏代练工作室等线上服务平台
护航系统采用ThinkPHP8.1+UniApp+Workerman技术栈,支持多端发布与毫秒级IM通信;含抢单事务控制、多角色管理、自动分账及风控体系,强调纯手工合规运营,严守防飞单、反外挂、未成年人保护红线。
433 3
|
2月前
|
存储 JSON 缓存
告别数据混乱!数据库设计三范式从入门到实践
数据库小学妹带你轻松入门三范式!用“建房打地基”比喻,讲清1NF(列不可分)、2NF(消除部分依赖)、3NF(消除传递依赖),直击数据冗余、更新异常等痛点。附实战拆表案例与反范式化提醒,助你设计出结构清晰、稳定高效的数据库!
|
编译器 C++
C++程序中的对象赋值和复制
C++程序中的对象赋值和复制
382 1
|
关系型数据库 MySQL Apache
mysql5.7 本地计算机上的mysql 服务启动后停止 的问题解决
mysql5.7 本地计算机上的mysql 服务启动后停止 的问题解决
402 0
|
NoSQL MongoDB Python
python mongodb pymongo 连接 身份认证
python mongodb pymongo 连接 身份认证
394 0
|
人工智能 算法 定位技术
AR 导航导览技术如何实现的?提供全场景解决方案深度解析
传统导航在复杂场景中存在定位断层、空间认知成本高及实景导航实施难等问题。AR导航导览通过“实景+虚拟融合”,结合高精度定位引擎、实时三维渲染引擎和智能路径规划引擎,实现室内外无缝衔接的沉浸式体验。如需AR导航导览解决方案欢迎私信获取,如有项目合作及技术交流欢迎私信作者哦~
1227 1
|
API
HarmonyOS 3.1/4项目在DevEco Studio 5.0(HarmonyOS NEXT)版本下使用的问题
有读者在使用《鸿蒙HarmonyOS应用开发入门》书中的源码时遇到问题,主要原因是使用的DevEco Studio版本不同所致。本文提供了三种解决方案:1) 降级DevEco Studio至3.1版本;2) 按照5.0版本修改书中示例;3) 等待并使用《鸿蒙之光HarmonyOS NEXT原生应用开发入门》升级版书籍。
1320 1
|
运维 监控 数据可视化
Hyper-V的哪些性能?使其成为企业构建云平台和虚拟化环境的首选
Hyper-V凭借高效性、灵活性、高可用性及管理简便性等优势,成为企业构建云平台和虚拟化环境的首选。其微内核架构、硬件辅助虚拟化技术和动态内存管理提升了性能与资源利用率;支持多操作系统和硬件平台,具备故障转移、实时迁移功能,确保业务连续性;提供可视化管理工具和PowerShell脚本自动化,简化管理流程;与Windows Server及Azure无缝集成,降低硬件、运维和能源成本。
|
人工智能 运维 架构师
开始报名,龙蜥社区系统运维联盟MeetUp暨iAutoBASE专题论坛来啦
12月27日,探讨车用基础软件技术及生态发展,欢迎报名。
开始报名,龙蜥社区系统运维联盟MeetUp暨iAutoBASE专题论坛来啦
|
缓存 网络协议 网络虚拟化
计算机网络 第八章 局域网(习题)
计算机网络 第八章 局域网(习题)
614 1