Dubbo集群容错

转自dubbo官网文档http://dubbo.apache.org/zh-cn/blog/dubbo-cluster-error-handling.html

Design For failure

在分布式系统中,集群某个某些节点出现问题是大概率事件,因此在设计分布式RPC框架的过程中,必须要把失败作为设计的一等公民来对待。一次调用失败之后,应该如何选择对失败的选择策略,这是一个见仁见智的问题,每种策略可能都有自己独特的应用场景。因此,作为框架来说,应当针对不同场景提供多种策略,供用户进行选择。

在Dubbo设计中,通过Cluster这个接口的抽象,把一组可供调用的Provider信息组合成为一个统一的Invoker供调用方进行调用。经过路由规则过滤,负载均衡选址后,选中一个具体地址进行调用,如果调用失败,则会按照集群配置的容错策略进行容错处理。

Dubbo默认内置了若干容错策略,如果不能满足用户需求,则可以通过自定义容错策略进行配置。

内置容错策略

Dubbo主要内置了如下几种策略:

  • Failover(失败自动切换)
  • Failsafe(失败安全)
  • Failfast(快速失败)
  • Failback(失败自动恢复)
  • Forking(并行调用)
  • Broadcast(广播调用)

这些名称比较相似,概念也比较容易混淆,下面逐一进行解释。

Failover(失败自动切换)

Failover是高可用系统中的一个常用概念,服务器通常拥有主备两套机器配置,如果主服务器出现故障,则自动切换到备服务器中,从而保证了整体的高可用性。

Dubbo也借鉴了这个思想,并且把它作为Dubbo默认的容错策略。当调用出现失败的时候,根据配置的重试次数,会自动从其他可用地址中重新选择一个可用的地址进行调用,直到调用成功,或者是达到重试的上限位置。

Dubbo里默认配置的重试次数是2,也就是说,算上第一次调用,最多会调用3次。

其配置方法,容错策略既可以在服务提供方配置,也可以服务调用方进行配置。而重试次数的配置则更为灵活,既可以在服务级别进行配置,也可以在方法级别进行配置。具体优先顺序为:

服务调用方方法级配置 > 服务调用方服务级配置 > 服务提供方方法级配置 > 服务提供方服务级配置

以XML方式为例,具体配置方法如下:

服务提供方,服务级配置

<dubbo:service interface="org.apache.dubbo.demo.DemoService" ref="demoService" cluster="failover" retries="2" /> 

服务提供方,方法级配置

<dubbo:service interface="org.apache.dubbo.demo.DemoService" ref="demoService"cluster="failover"> <dubbo:method name="sayHello" retries="2" /> </dubbo:reference> 

服务调用方,服务级配置

<dubbo:reference id="demoService" interface="org.apache.dubbo.demo.DemoService" cluster="failover" retries="1"/> 

服务调用方,方法级配置:

 <dubbo:reference id="demoService" interface="org.apache.dubbo.demo.DemoService" cluster="failover"> <dubbo:method name="sayHello" retries="3" /> </dubbo:reference> 

Failover可以自动对失败进行重试,对调用者屏蔽了失败的细节,但是Failover策略也会带来一些副作用:

  • 重试会额外增加一下开销,例如增加资源的使用,在高负载系统下,额外的重试可能让系统雪上加霜。
  • 重试会增加调用的响应时间。
  • 某些情况下,重试甚至会造成资源的浪费。考虑一个调用场景,A->B->C,如果A处设置了超时100ms,再B->C的第一次调用完成时已经超过了100ms,但很不幸B->C失败,这时候会进行重试,但其实这时候重试已经没有意义,因此在A看来这次调用已经超时,A可能已经开始执行其他逻辑。

Failsafe(失败安全)

失败安全策略的核心是即使失败了也不会影响整个调用流程。通常情况下用于旁路系统或流程中,它的失败不影响核心业务的正确性。在实现上,当出现调用失败时,会忽略此错误,并记录一条日志,同时返回一个空结果,在上游看来调用是成功的。

应用场景,可以用于写入审计日志等操作。

 

Failfast(快速失败)

某些业务场景中,某些操作可能是非幂等的,如果重复发起调用,可能会导致出现脏数据等。例如调用某个服务,其中包含一个数据库的写操作,如果写操作完成,但是在发送结果给调用方的过程中出错了,那么在调用发看来这次调用失败了,但其实数据写入已经完成。这种情况下,重试可能并不是一个好策略,这时候就需要使用到Failfast策略,调用失败立即报错。让调用方来决定下一步的操作并保证业务的幂等性。

 

Failback(失败自动恢复)

Failback通常和Failover两个概念联系在一起。在高可用系统中,当主机发生故障,通过Failover进行主备切换后,待故障恢复后,系统应该具备自动恢复原始配置的能力。

Dubbo中的Failback策略中,如果调用失败,则此次失败相当于Failsafe,将返回一个空结果。而与Failsafe不同的是,Failback策略会将这次调用加入内存中的失败列表中,对于这个列表中的失败调用,会在另一个线程中进行异步重试,重试如果再发生失败,则会忽略,即使重试调用成功,原来的调用方也感知不到了。因此它通常适合于,对于实时性要求不高,且不需要返回值的一些异步操作。

 

按照目前的实现,Failback策略还有一些局限,例如内存中的失败调用列表没有上限,可能导致堆积,异步重试的执行间隔无法调整,默认是5秒。

Forking(并行调用)

上述几种策略中,主要都是针对调用失败发生后如何进行弥补的角度去考虑的,而Forking策略则跟上述几种策略不同,是一种典型的用成本换时间的思路。即第一次调用的时候就同时发起多个调用,只要其中一个调用成功,就认为成功。在资源充足,且对于失败的容忍度较低的场景下,可以采用此策略。

 

Broadcast(广播调用)

在某些场景下,可能需要对服务的所有提供者进行操作,此时可以使用广播调用策略。此策略会逐个调用所有提供者,只要任意有一个提供者出错,则认为此次调用出错。通常用于通知所有提供者更新缓存或日志等本地资源信息。

 

各种策略对比

下表对各种策略做一个简单对比,

策略名称优点缺点主要应用场景
Failover对调用者屏蔽调用失败的信息增加RT,额外资源开销,资源浪费对调用rt不敏感的场景
Failfast业务快速感知失败状态进行自主决策产生较多报错的信息非幂等性操作,需要快速感知失败的场景
Failsafe即使失败了也不会影响核心流程对于失败的信息不敏感,需要额外的监控旁路系统,失败不影响核心流程正确性的场景
Failback失败自动异步重试重试任务可能堆积对于实时性要求不高,且不需要返回值的一些异步操作
Forking并行发起多个调用,降低失败概率消耗额外的机器资源,需要确保操作幂等性资源充足,且对于失败的容忍度较低,实时性要求高的场景
Broadcast支持对所有的服务提供者进行操作资源消耗很大通知所有提供者更新缓存或日志等本地资源信息

自定义容错策略

如果上述内置的容错策略无法满足你的需求,还可以通过扩展的方式来实现自定义容错策略。

扩展接口

com.alibaba.dubbo.rpc.cluster.Cluster

扩展配置

<dubbo:service cluster="xxx" />

扩展示例

下面通过一个例子来展示如何使用自定义的容错策略。 Maven 项目结构:

src|-main|-java|-com|-xxx|-XxxCluster.java (实现Cluster接口)|-resources|-META-INF|-dubbo|-org.apache.dubbo.rpc.cluster.Cluster (纯文本文件,内容为:xxx=com.xxx.XxxCluster)

XxxCluster.java:

package com.xxx;import org.apache.dubbo.rpc.cluster.Cluster;
import org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker;
import org.apache.dubbo.rpc.cluster.Directory;
import org.apache.dubbo.rpc.cluster.LoadBalance; import org.apache.dubbo.rpc.Invoker; import org.apache.dubbo.rpc.Invocation; import org.apache.dubbo.rpc.Result; import org.apache.dubbo.rpc.RpcException; import java.util.List; public class XxxCluster implements Cluster { @Override public <T> Invoker<T> join(Directory<T> directory) throws RpcException { return new AbstractClusterInvoker<T>() { @Override protected Result doInvoke(Invocation invocation, List<Invoker<T>> invokers, LoadBalance loadbalance) throws RpcException { // your custimzed fault tolarence strategy goes here } }; } } 

META-INF/dubbo/com.alibaba.dubbo.rpc.cluster.Cluster文件的内容为

xxx=com.xxx.XxxCluster

转载于:https://www.cnblogs.com/twoheads/p/10131929.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/278653.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux基础(day53)

2019独角兽企业重金招聘Python工程师标准>>> 12.21 php-fpm的pool php-fpm的pool目录概要 vim /usr/local/php/etc/php-fpm.conf//在[global]部分增加include etc/php-fpm.d/*.confmkdir /usr/local/php/etc/php-fpm.d/cd /usr/local/php/etc/php-fpm.d/vim www.co…

Mysql+Navicat for Mysql

一、mysql 1.下载安装 Mysql官网下载地址 下载后解压 .zip &#xff08;或安装.msi&#xff09; 2.可加入全局变量mysqld &#xff08;可选&#xff09; 我的电脑->属性->高级->环境变量->Path(系统变量)&#xff0c;添加mysql下的bin目录&#xff0c;如 D:\Pr…

公钥,私钥和数字签名

一、公钥加密 假设一下&#xff0c;我找了两个数字&#xff0c;一个是1&#xff0c;一个是2。我喜欢2这个数字&#xff0c;就保留起来&#xff0c;不告诉你们(私钥&#xff09;&#xff0c;然后我告诉大家&#xff0c;1是我的公钥。 我有一个文件&#xff0c;不能让别人看&…

MySQL中的日志类型(二)-General query log

简介 General query log记录客户端的连接和断开&#xff0c;以及从客户端发来的每一个SQL语句。 日志内容格式 General query log可以记录在文件中&#xff0c;也可以记录在表中&#xff0c;格式如下&#xff1a;在文件中会记录时间、线程ID、命令类型以及执行的语句示例如下&a…

android wi-fi_如何在Android手机上查找3G或Wi-Fi速度

android wi-fiAre you curious about what kind of connection speed you are getting with your Android phone? Today we’ll take a look at how to easily check your Wi-Fi or 3G speeds with Speedtest.net’s Speed Test app. 您是否对Android手机的连接速度感到好奇&a…

vue引入全局less实现全局变量的控制

vue引入全局less1.设置全局样式变量的好处&#xff1a;2.以less为例&#xff08;sass等同原理&#xff09;1.vue-cli2搭建的项目&#xff08;1&#xff09;2.vue-cli2搭建的项目&#xff08;2&#xff09;3.vue-cli3、vue-cli43.vue-cli2和vue-cli3的区别4.vue-cli3和vue-cli4的…

如何在eclipse中对项目进行重新编译

有时由于eclipse异常关闭&#xff0c;当我们重启Eclipse&#xff0c;在启动项目时&#xff0c;会报错&#xff0c;说&#xff1a;ClassNotFound类似的错误&#xff0c;引起这种问题的原因可能是由于&#xff0c;Eclipse异常关闭引起的。 解决&#xff1a;在一个项目中&#xff…

SQL 查询数据库中包含指定字符串的相关表和相关记录

declare str varchar(100)set str我要找的 --要搜索的字符串declare s varchar(8000)declare tb cursor local forselect if exists(select 1 from [b.name] where [a.name] like %str%)print [b.name].[a.name]from syscolumns a join sysobjects b on a.idb.idwhere b.xtype…

如何在Gmail的图片中插入超链接

Adding hyperlinks is an efficient way of getting your reader to the intended web page. Though it’s no secret that you can add hyperlinks to text, Gmail also lets you add hyperlinks to images in the body of the email. Here’s how to make it happen. 添加超链…

内联元素居中

父元素&#xff1a; height:100px; line-height:100px; // 与高相同 text-align:center; 子元素: display:inline; vertical-align: middle; 适用图片、文字 <div><div class"wrapper"><span>我是文字</span></div><div class&qu…

防止html标签转义

function htmlDecode ( str ) {var ele document.createElement(span);ele.innerHTML str;return ele.textContent;} 例如body下边所有的p标签都防止转义&#xff1a; $.each($("body").find(p),function(){this.innerHTML htmlDecode(this.innerHTML);}); 转载于…

新垣结衣自拍照_如何阻止自拍照出现在iPhone的自拍照专辑中

新垣结衣自拍照Khamosh PathakKhamosh PathakThe Photos app on your iPhone automatically populates all photos from the front-facing camera in the Selfies album. But what if you don’t want a photo to appear there? Here are a couple of solutions. iPhone上的“…

前端个人笔记

前端个人笔记1.vue项目安装依赖/插件时忘记--save&#xff0c;再次install出问题并且没有报错。2.margin移动元素不显示背景色3.新知识&#xff1a;media 条件样式4.入坑&#xff1a;row和col不能分离&#xff0c;span24不能不写5.聚焦实现滚动到指定元素1.vue项目安装依赖/插件…

kernel中对文件的读写【学习笔记】【原创】

/*1. 头文件 */ #include <linux/init.h> #include <linux/module.h> #include <linux/moduleparam.h> #include <linux/kernel.h> #include <linux/list.h> #include <linux/fs.h> #include <linux/uaccess.h>MODULE_PARM_DESC(iva…

ssm项目快速搭建(注解)-依赖

父层jar包版本控制&#xff0c;管理配置 <!-- 集中定义依赖版本号 --> <properties> <junit.version>4.12</junit.version> <spring.version>4.2.4.RELEASE</spring.version> <pagehelper.version>4.0.0<…

如何设置自定义任务栏图标_如何为任何应用程序自定义Windows 7任务栏图标

如何设置自定义任务栏图标Would you like to change out the icons on your taskbar with a beautiful set of icons that all go together? Here’s how you can change out the random candy-colored icons for a stylish icon set of your choice. 您是否要用一组漂亮的图…

给谷歌浏览器安装vue调试工具:vue-devtools

安装vue-devtools一、拉取项目二、install、build三、添加扩展四、使用举例一、拉取项目 vue-devtools&#xff1a;git地址&#xff08;master分支&#xff09; 非master分支在build的时候会报错。 二、install、build 1、打开cmd进入项目目录&#xff0c;可以选择npm/cnpm/…

如何找到Windows 7或8家庭组密码?

So you’re about to setup your new Windows 7 PC into your Homegroup when you realized that you have no idea what the password is. How do you find it? It’s actually pretty simple, if you know where to look. 因此&#xff0c;当您意识到自己不知道密码是什么时…

vue3.0、cli4项目引入element plus

element团队为新版的 vue-cli4 准备了相应的 Element Plus 插件 安装依赖 npm install element-plus --savemain.js全局引入&#xff0c;样式文件需要单独引入 import { createApp } from vue import ElementPlus from element-plus; import element-plus/lib/theme-chalk/in…

MySQL索引背后的数据结构及算法原理

title: MySQL索引背后的数据结构及算法原理 date: 2018-07-25 19:50:16 tags: mysql categories: mysql --- 本文转载自http://blog.codinglabs.org/articles/theory-of-mysql-index.html 摘要 本文以MySQL为研究对象&#xff0c;讨论与数据库索引相关的一些话题。特别需要说明…