基于Python语言的熔断处理方法、装置、设备、介质及产品与流程
未命名
07-14
阅读:112
评论:0
基于python语言的熔断处理方法、装置、设备、介质及产品
技术领域
1.本技术涉及python开发领域,具体而言,本技术涉及一种基于python语言的熔断处理方法、装置、设备、介质及产品。
背景技术:
2.在基于python语言的rpc(remote procedure call,远程服务调用)场景中,若下游依赖出现响应故障,在上游接口处需执行超时等待才能进行返回处理,这将导致整体运行时延增加;若下游依赖出现异常故障,在上游接口处未做好兼容处理,导致故障逐层上报最终影响用户体验;若下游资源紧张以致不足以快速响应上游请求,且在上游接口处依旧发送大量请求,这将导致下游依赖不堪重负。
3.目前,针对下游依赖出现的上述各种问题,一般的处理方式为超时处理,但该方式处理效率比较低下;比较高效的处理方式有熔断器处理,虽然该方式相较于超时处理有诸多优点,但是现有的熔断器一般采用固定的方式。若遇到场景变化,则需要修改原有代码以实现增加与场景适配的熔断器的目的,比较耗时耗力。
技术实现要素:
4.为了解决上述技术问题之一,本技术实施例提供了一种基于python语言的熔断处理方法、装置、设备、介质及产品。如下所示为上述多个方案的具体内容。
5.一方面,本技术实施例提供了一种基于python语言的熔断处理方法,该方法包括:
6.从预先创建的多个python装饰器中确定目标装饰器,每个python装饰器用于执行一种熔断策略,熔断策略用于表征不同熔断状态间的切换规则;响应于针对预设远程服务的调用指令,确定预设远程服务的当前熔断状态;根据当前熔断状态发起调用,并根据当前熔断状态、调用结果以及目标装饰器执行的目标熔断策略判断是否切换当前熔断状态。
7.可选的,,不同的熔断策略依据不同类型的参数表征不同熔断状态间的切换规则;其中,目标熔断策略对应的目标类型的参数为以下任一种:响应时长、设备运行数据、响应结果、预设时间内的响应结果。
8.可选的,当前熔断状态为关闭状态;根据当前熔断状态发起调用,并根据当前熔断状态、调用结果以及目标装饰器执行的目标熔断策略判断是否切换当前熔断状态,包括:
9.向预设远程服务发起远程调用,并根据目标类型的参数确定调用结果,调用结果用于指示目标类型的参数是否匹配第一参数值;若确定调用结果触发目标熔断策略中的第一切换规则,则将当前熔断状态由关闭状态切换至开启状态;第一切换规则包括:目标类型的参数匹配第一参数值,或者目标类型的参数匹配第一参数值的累计次数达到第一预设次数。
10.可选的,当前熔断状态为半开启状态,根据当前熔断状态发起调用,并根据当前熔断状态、调用结果以及目标装饰器执行的目标熔断策略判断是否切换当前熔断状态,包括:
11.向预设远程服务发起远程调用,并根据目标类型的参数确定调用结果,调用结果
用于指示目标类型的参数是否匹配第二参数值。若确定调用结果触发目标熔断策略中的第二切换规则,则将当前熔断状态由半开启状态切换至开启状态;第二切换规则包括:目标类型的参数匹配第二参数值,或者目标类型的参数匹配第二参数值的累计次数达到第二预设次数。若确定调用结果触发目标熔断策略中的第三切换规则,则将当前熔断状态由半开启状态切换至关闭状态;第三切换规则包括:目标类型的参数不匹配第二参数值,或者目标类型的参数不匹配第二参数值的累计次数达到第三预设次数。
12.可选的,当前熔断状态为开启状态;根据当前熔断状态发起调用,并根据当前熔断状态、调用结果以及目标装饰器执行的目标熔断策略判断是否切换当前熔断状态,包括:
13.向与预设远程服务相适配的兜底服务发起调用,以便拦截对预设远程服务的调用;兜底服务为本地服务。将当前的累计拦截时间和/或累计拦截次数作为调用结果。若确定调用结果触发目标熔断策略中的第四切换规则,则将当前熔断状态由开启状态切换至半开启状态;第四切换规则包括:累计拦截时间不小于预设拦截时间阈值,和/或,累计拦截次数不小于预设拦截次数阈值。
14.可选的,目标装饰器的创建过程包括:
15.获取由python语言编写目标装饰器的逻辑代码,逻辑代码中包括缺省部位。将目标熔断策略所依据的目标类型的参数对应的切换条件输入缺省部位。通过编译操作得到目标装饰器。
16.可选的,响应于针对预设远程服务的调用指令,该方法包括:
17.响应于针对预设远程服务的调用指令,设置预设数量的采集窗口,采集窗口的时间长度为预设单位时长;通过预设数量的采集窗口采集调用指令的响应结果,以便为各熔断状态间的切换提供数据依据。
18.可选的,该方法还包括:
19.统计预设时间内针对预设远程服务的调用结果;调用结果包括调用服务已成功、调用服务已失败、已拦截服务调用和未知调用;根据每一调用结果的统计结果进行数据展示。
20.另一方面,本技术实施例还提供了一种基于python语言的熔断处理装置,该装置包括如下模块。
21.第一确定模块,用于从预先创建的多个python装饰器中确定目标装饰器,每个python装饰器用于执行一种熔断策略,熔断策略用于表征不同熔断状态间的切换规则。
22.第二确定模块,用于响应于针对预设远程服务的调用指令,确定预设远程服务的当前熔断状态。
23.判断模块,用于根据当前熔断状态发起调用,并根据当前熔断状态、调用结果以及目标装饰器执行的目标熔断策略判断是否切换当前熔断状态。
24.本技术实施例还提供了一种电子设备,该电子设备包括:
25.存储器、处理器及存储在存储器上的计算机程序,其特征在于,处理器执行计算机程序以实现一种基于python语言的熔断处理方法。
26.本技术实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,其特征在于,计算机程序被处理器执行时实现一种基于python语言的熔断处理方法。
27.本技术实施例还提供了一种计算机程序产品,包括计算机程序,其特征在于,计算
机程序被处理器执行时实现一种基于python语言的熔断处理方法。
28.本技术实施例提供的技术方案带来的有益效果是:
29.本技术实施例提供了一种基于python语言的熔断处理方法,该方法包括:从预先创建的多个python装饰器中确定目标装饰器,每个python装饰器用于执行一种熔断策略,熔断策略用于表征不同熔断状态间的切换规则;响应于针对预设远程服务的调用指令,确定预设远程服务的当前熔断状态;根据当前熔断状态发起调用,并根据当前熔断状态、调用结果以及目标装饰器执行的目标熔断策略判断是否切换当前熔断状态。其中,python语法中存在两种python装饰器,函数装饰器和类装饰器。不管是哪一种python装饰器,可以让其他函数在不需要做任何代码变动的前提下增加额外功能,或者方法类在不需要做任何代码变动的前提下增加额外功能。该方法使用python装饰器的优势,在避免修改原代码的基础上根据熔断策略来实现相应python装饰器,从而实现增加新的熔断策略的目的。因此,该方法既可以通过布局多个熔断策略以适应不同场景的目的,并且还可以在避免修改原代码的基础上通过新增python装饰器的手段来适应场景的变化,最终实现减少开发人员的工作量的目的。
附图说明
30.为了更清楚地说明本技术实施例中的技术方案,下面将对本技术实施例描述中所需要使用的附图作简单地介绍。
31.图1为本技术实施例提供的一种基于python语言的熔断处理方法的流程示意图;
32.图2为本技术实施例提供的一种基于python语言的熔断处理方法的应用场景示意图;
33.图3为本技术实施例提供的一种基于python语言的熔断处理装置的结构示意图;
34.图4为本技术实施例提供的一种电子设备的结构示意图。
具体实施方式
35.下面结合本技术中的附图描述本技术的实施例。应理解,下面结合附图所阐述的实施方式,是用于解释本技术实施例的技术方案的示例性描述,对本技术实施例的技术方案不构成限制。
36.本技术领域技术人员可以理解,除非特意声明,这里使用的单数形式“一”、“一个”、“所述”和“该”也可包括复数形式。应该进一步理解的是,本技术实施例所使用的术语“包括”以及“包含”是指相应特征可以实现为所呈现的特征、信息、数据、步骤、操作、元件和/或组件,但不排除实现为本技术领域所支持其他特征、信息、数据、步骤、操作、元件、组件和/或它们的组合等。应该理解,当我们称一个元件被“连接”或“耦接”到另一元件时,该一个元件可以直接连接或耦接到另一元件,也可以指该一个元件和另一元件通过中间元件建立连接关系。此外,这里使用的“连接”或“耦接”可以包括无线连接或无线耦接。这里使用的术语“和/或”指示该术语所限定的项目中的至少一个,例如“a和/或b”可以实现为“a”,或者实现为“b”,或者实现为“a和b”。
37.为使本技术的目的、技术方案和优点更加清楚,下面将结合附图对本技术实施方式作进一步地详细描述。
38.python语言,一门计算机编程语言。其中,装饰器(decorator)是python中的一种语法格式,如@classmethod、@staticmethod、@property、@xxx.setter、@wraps()、@func_name都是一种装饰器。装饰器可以让其他函数在不需要做任何代码变动的前提下增加额外功能。
39.一般而言,装饰器可用于以下场景:插入日志、性能测试、事务处理、缓存、权限校验等场景。在本技术实施例中,装饰器主要用于为预设远程服务配置熔断功能。
40.为解决背景技术所示的问题,本技术实施例提供了一种基于python语言的熔断处理方法,可应用于任一电子设备。具体而言,从预先创建的多个python装饰器中确定目标装饰器,每个python装饰器用于执行一种熔断策略,熔断策略用于表征不同熔断状态间的切换规则;响应于针对预设远程服务的调用指令,确定预设远程服务的当前熔断状态;根据当前熔断状态发起调用,并根据当前熔断状态、调用结果以及目标装饰器执行的目标熔断策略判断是否切换当前熔断状态。该方法通过python装饰器实现了在原有代码的基础上,根据熔断策略来实现相应python装饰器,也即不修改代码就可以增加新的熔断策略。总的来说,该方法既可以通过布局多个熔断策略以适应不同场景的目的,并且还可以在避免修改原代码的基础上通过新增python装饰器的手段来适应场景的变化,最终实现减少开发人员的工作量的目的。
41.可选的,本技术实施例提供的方法可以实现为一独立的应用程序或者是一应用程序的功能模块/插件。比如,该应用程序可以是专门的基于python语言的熔断处理或者是具有基于python语言的熔断处理功能的其他应用程序,通过该应用程序,可以实现熔断处理的目的。
42.下面通过对几个示例性实施方式的描述,对本技术实施例的技术方案以及本技术的技术方案产生的技术效果进行说明。需要指出的是,下述实施方式之间可以相互参考、借鉴或结合,对于不同实施方式中相同的术语、相似的特征以及相似的实施步骤等,不再重复描述。
43.本技术实施例提供了一个方法实施例以解决上述技术问题。具体而言,图1示出了一种基于python语言的熔断处理方法的流程示意图。其中,该方法包括步骤s110~s130。
44.s110,从预先创建的多个python装饰器中确定目标装饰器,每个python装饰器用于执行一种熔断策略,熔断策略用于表征不同熔断状态间的切换规则。
45.其中,python语法中定义了两种python装饰器。一种是本质为python函数的函数装饰器,通常以符号“@”开头;函数装饰器既可以装饰其他的python函数,也可以装饰python类。另一种是本质为python类的类装饰器,也是以符号“@”开头;函数装饰器既可以装饰python函数,也可以装饰其他的python类。如,python自带几个内置装饰器:@classmethod;@staticmethod;@property。
46.其中,将python装饰器所装饰的python函数或者python类理解为目标函数或者目标类。应当指出,装饰器装饰目标函数或者目标类的目的在于提供目标函数或者目标类配置新的功能。
47.为了了解python装饰器的实现过程,本技术实施例还提供了一个函数装饰器的应用示例。
48.本示例中,函数装饰器即为“logger(func)”,被装饰的python函数为“add(x,y)”。
通过该示例可以了解,在不改变“add(x,y)”原有代码的条件下,就实现了为“add(x,y)”的输出增加了解释性语言的目的。
[0049][0050]
本示例中,输入参数200和50,也即add(200,50),可以得到如下结果:
[0051]
我准备开始计算:add函数了:
[0052]
200+50=250
[0053]
计算完毕!
[0054]
可选的,不同的熔断策略依据不同类型的参数表征不同熔断状态间的切换规则;其中,目标熔断策略对应的目标类型的参数为以下任一种:响应时长、设备运行数据、响应结果、预设时间内的响应结果。
[0055]
具体而言,目标类型的参数为响应时长时,若调用预设远程服务的响应时长超过预设响应时间,则可确定预设远程服务的调用出现问题;若在预设响应时间内接收到了响应结果,则可确定预设远程服务的调用未出现问题。若多次确定预设远程服务的调用出现问题,则需要对预设远程服务采取熔断处理的措施。
[0056]
具体而言,目标类型的参数为设备运行数据时,在调用预设远程服务的过程中,检测到设备运行数据超过预设运行阈值,则可确定预设远程服务的调用过程影响了设备的正常运行;若检测到设备运行时的指标未超过预设运行阈值,则可确定预设远程服务未影响设备的正常运行。对于影响了设备运行的预设远程服务,则需要对其采取熔断处理的措施。如,设备运行数据可以具体为cpu的运行数据,或者gpu的运行数据。
[0057]
具体而言,目标类型的参数为响应结果时,若预设远程服务的响应结果为包含“failure”的信息或者与“failure”相匹配的信息,则可确定预设远程服务的响应结果为错误;若预设远程服务的响应结果为包含“success”的信息或者与“success”相匹配的信息,则可确定预设远程服务的响应结果为正确。若响应结果多次为包含“failure”的信息或者与“failure”相匹配的信息,则需要采取熔断处理的措施。
[0058]
具体而言,目标类型的参数为预设时间内的响应结果时,若在预设时间内,预设远程服务的响应结果为包含“failure”的信息或者与“failure”相匹配的信息,则可确定预设远程服务的响应结果为错误;若预设远程服务的响应结果为包含“success”的信息或者与“success”相匹配的信息,则可确定预设远程服务的响应结果为正确。若在预设时间内,响应结果多次为包含“failure”的信息或者与“failure”相匹配的信息,则需要采取熔断处理
的措施。
[0059]
s120,响应于针对预设远程服务的调用指令,确定预设远程服务的当前熔断状态。
[0060]
其中,预设远程服务的熔断状态可以包括如下三种状态:
[0061]
关闭状态。具体而言,熔断状态为关闭状态时,表示关闭对预设远程服务的熔断处理,并正常调用预设远程服务。
[0062]
开启状态。具体而言,熔断状态为开启状态时,表示开启对预设远程服务的熔断处理,也即拦截对预设远程服务的调用。
[0063]
半开启状态。具体而言,熔断状态为半开启状态时,表示正常调用部分的预设远程服务,并根据调用情况确定是否切换为开启状态或者关闭状态。
[0064]
由于不同场景下对于熔断的处理思路不同,因而产生不同的熔断策略,为了实施每种熔断策略以解决不同场景下的熔断业务需求,在创建熔断组件时,还可以获取与每种熔断策略相应的参数阈值。
[0065]
在该实施例的一种实现方式中,目标熔断组件的创建过程包括:
[0066]
通过python语言编写目标装饰器的逻辑代码,逻辑代码中包括缺省部位;将目标熔断策略所依据的目标类型的参数对应的切换条件输入缺省部位;通过编译操作得到目标装饰器。
[0067]
可选的,可通过配置目标类型的参数来实现对目标熔断策略的配置。具体而言,本技术实施例中熔断状态存在上述3种,则3种状态之间的切换条件中包括多种阈值。如,从关闭状态到开启状态,针对“响应时间”设置第一参数值,比较响应时间与第一参数值的匹配度,以及设置响应时间匹配第一参数值时的累计匹配次数阈值,也即第一预设次数。
[0068]
为了更清楚地理解python装饰器的创建过程,本技术实施例还提供一段示例性代码。
[0069]
本示例中,目标函数为rpc(),也即针对预设远程服务进行调用的函数。其中,为rpc()增加的是python类装饰器“policy”。其中,本示例所依据的参数为响应时间。
[0070]
class policy(object)//python类装饰器
[0071]
……
[0072]
def_mark_failure(self)://标记单次请求失败
[0073]
……
[0074]
def__check_fuse(self)://判断是否进入熔断状态。
[0075]
……
[0076]
@policy
[0077]
def rpc()://被装饰的目标函数
[0078]
……
[0079]
s130,根据当前熔断状态发起调用,并根据当前熔断状态、调用结果以及目标装饰器执行的目标熔断策略判断是否切换当前熔断状态。
[0080]
本技术实施例提供的方法是基于python语言的,在python语法中存在两种python装饰器,函数装饰器和类装饰器。不管是哪一种python装饰器,可以让其他python函数在不需要做任何代码变动的前提下增加额外功能,或者python类在不需要做任何代码变动的前提下增加额外功能。该方法使用python装饰器的优势,在避免修改原代码的基础上根据熔
断策略来实现相应python装饰器,从而实现增加新的熔断策略的目的。因此,该方法既可以通过布局多个熔断策略以适应不同场景的目的,并且还可以在避免修改原代码的基础上通过新增python装饰器的手段来适应场景的变化,最终实现减少开发人员的工作量的目的。
[0081]
目标熔断策略对不同熔断状态下的切换规则是不同的,本技术实施例提供了一个实施例,来具体参数如何根据熔断状态的类型确定是否切换当前熔断状态。
[0082]
在该实施例的一种实现方式中,当前熔断状态为关闭状态。其中,步骤s130具体可以包括如下步骤sa1~sa3。
[0083]
sa1,向预设远程服务发起远程调用。
[0084]
具体而言,在熔断状态为关闭状态的条件下,可向远程服务发起调用,并且在调用过程中,可监测调用过程中的各种数据。如,若目标类型的参数为“响应时长”,则监测调用远程服务时反馈响应结果的时间;若目标类型的参数为“响应结果”,则监测调用远程服务时反馈的响应结果是否为“failure”或者与“failure”相匹配的信息。
[0085]
sa2,根据目标类型的参数确定调用结果,调用结果用于指示目标类型的参数是否匹配第一参数值。
[0086]
其中,第一参数值为指示需要进行熔断处理的数值。而与第一参数值相匹配则说明了当前的调用结果需要进行熔断处理,或者需要通过累计以便实现熔断处理的目的。也即,需要将熔断状态调整至开启状态。
[0087]
具体而言,根据目标类型的参数从监控的数据中确定调用结果,并通过调用结果来确定目标类型的参数是否匹配第一参数值。如,目标类型的参数为“响应时长”时,则第一参数值为预设的响应时长数值;其中,响应时长不小于第一参数值,则确定匹配第一参数值;其中,响应时长小于第一参数值,则确定不匹配第一参数值。如,目标类型的参数为“设备运行数据”时,则第一参数值为预设的运行阈值;其中,若设备运行数据不小于运行阈值,则确定匹配第一参数值;其中,设备运行数据小于运行阈值,则确定不匹配第一参数值。如,目标类型的参数为“响应结果”,则第一参数值为“failure”或者与“failure”相匹配的信息;其中,若“响应结果”为“failure”或者与“failure”相匹配的信息,则确定匹配第一参数值;若“响应结果”不为上述信息,则确定不匹配第一参数值。
[0088]
其中,设备运行数据可以为cpu的运行数据,或者gpu的运行数据等。以cpu的运行数据为例,设置cpu的运行阈值为80%,若当前的cpu的运行数据为81%,则确定cpu的运行数据与第一参数值匹配。
[0089]
sa3,若确定调用结果触发目标熔断策略中的第一切换规则,则将当前熔断状态由关闭状态切换至开启状态;第一切换规则包括:目标类型的参数匹配第一参数值,或者目标类型的参数匹配第一参数值的累计次数达到第一预设次数。
[0090]
具体而言,目标熔断策略中设置有第一切换规则,该规则用于指示如何从关闭状态切换至开启状态。
[0091]
具体而言,若目标类型的参数为设备运行数据,依据的第一切换规则为“目标类型的参数匹配第一参数值”,也即设备运行数据与第一参数值相匹配时,则可以实施切换操作。若目标类型的参数为“响应时间”、“响应结果”、“预设时间内的响应结果”,依据的第一切换规则为“目标类型的参数匹配第一参数值的累计次数达到第一预设次数”作为切换规则,以相应时间为例,响应时间每匹配第一参数值一次则进行一次累计,在累计次数达到第
一预设次数时,则可以执行切换操作。
[0092]
为了更清楚地理解第一切换规则的实施过程,可以参考下述伪代码示例。本示例中,被装饰的函数为rpc()
[0093][0094]
本示例中,在当前熔断状态为关闭状态时,需直接调用预设远程服务。具体而言,在调用rpc()函数结束之后,得到反馈是否调用成功的回调结果。其中,若调用结果为failure或者与failure相匹配的信息(对应第一参数值),则需要进行一次失败累加操作,如通过“mark_failure(self)”来执行失败累加操作,如对“_bad_count”进行自加1的操作;在累加结束之后,需要检查累加的数值是否触发了第一预设次数(也即执行self._bad_count》self._threshold),若触发了第一预设次数,则需要将当前熔断状态从开启状态调整至关闭状态(也即self._state=policystate.mask)。
[0095]
本示例中,在调整完状态之后,还可以对累加参数进行清零操作,如执行“self._bad_count=0”。
[0096]
在该实施例的另一种实现方式中,当前熔断状态为半开启状态。其中,步骤s130具体可以包括如下步骤sb1~sb4。
[0097]
sb1,向预设远程服务发起远程调用。
[0098]
具体而言,在熔断状态为关闭状态的条件下,也可向远程服务发起调用,并且在调用过程中,可监测调用过程中的各种数据。
[0099]
sb2,根据目标类型的参数确定调用结果,调用结果用于指示目标类型的参数是否匹配第二参数值。
[0100]
其中,第二参数值为指示需要进行熔断处理的数值。而与第二参数值相匹配则说
明了当前的调用结果需要进行熔断处理,或者需要通过累计以便达到熔断处理的目的。也即,需要将熔断状态调整至开启状态。
[0101]
由于当前熔断状态为半开启状态,所以在对目标类型的参数进行匹配时,需要另外设置第二参数值。具体而言,根据目标类型的参数从监控的数据中确定调用结果,并通过调用结果来确定目标类型的参数是否匹配第二参数值。
[0102]
具体而言,根据目标类型的参数从监控的数据中确定调用结果,并通过调用结果来确定目标类型的参数是否匹配第二参数值。如,目标类型的参数为响应时长时,则第二参数值为预设的响应时长数值;其中,响应时长不小于第二参数值,则确定匹配第二参数值;其中,响应时长小于第二参数值,则确定不匹配第二参数值。如,目标类型的参数为设备运行数据时,则第二参数值为预设的运行阈值;其中,若设备运行数据不小于运行阈值,则确定匹配第二参数值;其中,设备运行数据小于运行阈值,则确定不匹配第二参数值。如,目标类型的参数为响应结果,则第二参数值为“failure”或者与“failure”相匹配的信息;其中,若响应结果为“failure”或者与“failure”相匹配的信息,则确定匹配第二参数值,若“响应结果”不为“failure”或者与“failure”不匹配的信息,则确定不匹配第二参数值。
[0103]
sb3,若确定调用结果触发目标熔断策略中的第二切换规则,则将当前熔断状态由半开启状态切换至开启状态;第二切换规则包括:目标类型的参数不匹配第二参数值,或者目标类型的参数不匹配第二参数值的累计次数达到第二预设次数。
[0104]
具体而言,目标熔断策略中设置有第二切换规则,该规则用于指示如何从半开启状态切换至开启状态。
[0105]
其中,若目标类型的参数为设备运行数据,依据的第二切换规则为“目标类型的参数匹配第二参数值”,也即设备运行数据与第二参数值相匹配时,则可以实施切换操作。若目标类型的参数为“响应时间”、“响应结果”、“预设时间内的响应结果”,依据的第二切换规则为“目标类型的参数匹配第二参数值的累计次数达到第二预设次数”作为切换规则。以响应时间为例,每次响应时间匹配第二参数值,则进行一次累计,在累计次数达到第二预设次数时,则可以执行切换操作。
[0106]
sb4,若确定调用结果触发目标熔断策略中的第三切换规则,则将当前熔断状态由半开启状态切换至关闭状态;第三切换规则包括:目标类型的参数匹配第二参数值,或者目标类型的参数匹配第二参数值的累计次数达到第三预设次数。
[0107]
具体而言,目标熔断策略中设置有第三切换规则,该规则用于指示如何从半开启状态切换至关闭状态。
[0108]
其中,若目标类型的参数为设备运行数据,依据的第二切换规则为“目标类型的参数不匹配第二参数值”,也即设备运行数据与第二参数值相匹配时,则可以实施切换操作。若目标类型的参数为“响应时间”、“响应结果”、“预设时间内的响应结果”,依据的第二切换规则为“目标类型的参数不匹配第二参数值的累计次数达到第二预设次数”作为切换规则。以响应时间为例,响应时间每不匹配第二参数值一次,则进行一次累计,在累计次数达到第三预设次数时,则可以执行切换操作。
[0109]
为了更清楚地理解第二切换规则和第三切换规则的实施过程,该实施例还提供了一段伪代码示例。本示例中,目标熔断策略依据的参数为响应结果。
[0110][0111][0112]
本示例中,在当前熔断状态为半开启状态时,需直接调用预设远程服务。具体而言,在调用rpc()函数结束之后,得到反馈是否调用成功的回调结果。
[0113]
其中,若回调结果为调用成功则执行一次成功累加(如:执行_mark_success(self)函数),具体而言,是对累加参数进行自加1的操作(如:执行_halfopen_good_count+=1);在累加结束之后,需判断累加参数是否超过第二预设次数(如self._halfopen_trials);在判断不小于第二预设次数的情况下,则将当前熔断状态设置为关闭状态(如policystate.open)。
[0114]
其中,若回调结果为调用失败则执行一次成功累加(如:执行_mark_failure(self)函数),在该函数中执行累加参数自加的操作(如:执行_halfopen_good_count+=1);在累加结束之后,需判断累加参数是否超过第二预设次数(如self._halfopen_trials);在判断不小于第二预设次数的情况下,则将当前熔断状态设置为关闭状态(如policystate.open)
[0115]
本示例中,在调整完当前状态之后,还需要对累加参数进行清零处理。
[0116]
在该实施例的又一种实现方式中,当前熔断状态为开启状态。其中,步骤s130具体包括如下步骤sc1~sc3。
[0117]
sc1,向与预设远程服务相适配的兜底服务发起调用,以便拦截对预设远程服务的调用。其中,兜底服务为本地服务。
[0118]
可选的,调用指令中还包括针对预设远程服务的调用参数。具体而言,根据调用指令携带的调用参数向兜底服务发起调用,从而得到兜底数据,该兜底数据与调用预设远程服务所得到的反馈数据的类型一致。其中,兜底服务是为了在拦截对预设远程服务的调用时,以完成调用指令的指示为目的提供兜底的响应数据;其中,兜底的响应数据预先存储于本地。其中,兜底服务是存在服务级别的,具体而言,若不通过任一参数直接调用兜底服务,则可以得到默认的兜底数据,该兜底服务级别较低;若通过至少一项参数调用兜底服务,则可以得到与至少一项参数响应的兜底数据,该兜底服务级别较高。
[0119]
为了更清楚地理解兜底服务的实施效果,本技术还提供了一个具体示例。本示例中,预设远程服务为远程获取当前页面的用户头像,因此预设远程服务的响应数据包括该用户的头像地址等。其中,该调用指令中携带有用户的性别信息,若直接调用兜底服务,则反馈默认的用户头像。若通过“性别信息”调用兜底服务,则反馈与性别信息相应的用户头像,如男性则反馈男性头像,若女性则反馈女性头像。
[0120]
另外,还可以结合调用指令的多个参数来确定反馈的数据,为描述简便,在此不再赘述。通过对兜底数据进行级别设置,实现对兜底数据的自定义操作,提高了用户体验。
[0121]
sc2,将当前的累计拦截时间和/或累计拦截次数作为调用结果。
[0122]
sc3,若确定调用结果触发目标熔断策略中的第四切换规则,则将当前熔断状态由开启状态切换至半开启状态;第四切换规则包括:累计拦截时间不小于预设拦截时间阈值,和/或,累计拦截次数不小于预设拦截次数阈值。
[0123]
其中,在熔断状态处于开启状态时,可通过设置拦截次数阈值和/或拦截时间阈值来进行拦截处理。具体而言,设置拦截次数阈值时,累计拦截次数作为调用结果,并与拦截次数阈值进行比较,若不小于拦截次数阈值,则确定触发了第四切换规则。设置拦截时间阈值时,累计拦截时间作为调用结果,并与拦截时间阈值进行比较,若不小于拦截时间阈值,则确定触发了第四切换规则。
[0124]
为了更清楚地理解第四切换规则的实施过程,该实施例还提供了一段伪代码示例。本示例中,目标熔断策略依据的参数为累计拦截时间。
[0125]
[0126][0127]
本示例中,在熔断状态为开启的状态下,熔断针对预设远程服务的调用,并进行累计操作(如通过执行try_call(self,func,*args,**kwargs)函数实现);其中,在累计熔断时间小于20s的情况下,则保持熔断状态为开启状态(如:执行raise policymasked());在累计熔断时间不小于20s的情况下,则设置当前熔断状态为半开启状态。
[0128]
在调用过程中,如何对每一次调用过程实施监控,以便为状态切换提供有价值的数据参考,也是本技术急需解决的技术问题。为此,本技术实施例还提供了一个可选的实施例。
[0129]
在该实施例的一种实现方式中,该方法除了步骤s120~s130,还包括如下步骤sd1~sd2。
[0130]
sd1,响应于针对预设远程服务的调用指令,设置预设数量的采集窗口,采集窗口的时间长度为预设单位时长。
[0131]
具体而言,将单位时间作为一个采集窗口,那么采集窗口的时间长度为预设单位时长。随着时间的推移,预设数量的采集窗口会随着时间推移的方向移动。
[0132]
sd2,通过预设数量的采集窗口采集调用指令的响应结果,以便为各熔断状态间的切换提供数据依据。
[0133]
具体而言,在一个采集窗口中,监控针对预设远程服务的调用过程,获取目标类型的参数。如,对于“响应时间”而言,监控调用预设远程服务的响应时间。
[0134]
为了更好的理解采集窗口的工作原理,本技术还提供了一个具体示例。本示例中,设置60个采集窗口,每个采集窗口的时间长度为1秒钟,也即将1分钟分割为60个单元格。在时段14:00:01~14:00:02中,60个采集窗口依次采集相应窗口处的多个参数,如:响应时间、设备性能和响应结果等。采集操作直到14:00:02结束,然后60个采集窗口又滑动至时段14:00:02~14:00:03,继续进行数据采集。
[0135]
在访问预设远程服务的过程中,最后的结果存在多种,如何向用户反馈这些结果以实现熔断监测的目的也是需要解决的一项问题。为此,本技术实施例还提供了一个可选的实施例。
[0136]
在该实施例的一种实现方式中,该方法还包括如下步骤se1~se2。
[0137]
se1,统计预设时间内针对预设远程服务的调用结果;调用结果包括调用服务已成功、调用服务已失败、已拦截服务调用和未知调用。
[0138]
se2,根据每一调用结果的统计结果进行数据展示。
[0139]
具体而言,在当前熔断状态为关闭状态,则在调用远程服务结束之后,确定调用结果是否为调用服务已成功、调用服务已失败和未知调用中任一个;或者,在当前熔断状态为半开启状态,则在调用远程服务结束之后,确定调用结果是否为调用服务已成功、调用服务已失败和未知调用中任一个。在当前熔断状态为开启状态,则直接统计已拦截服务调用的次数。
[0140]
为了更清楚地理解se1~se2的执行过程,本技术还提供了一段时间内的统计数据以及大盘展示操作的示例。本示例的演示过程中,当前熔断状态经历了如下过程:关闭状态-》开启状态-》半开启状态-》关闭状态。
[0141]
具体而言,具体而言,从一开时,熔断状态为关闭状态;从15:44开始预设远程服务的调用结果呈现不正常,开始出现调用服务已失败的情况,并且还呈现上升趋势;在15:46分的时候,开始实施熔断处理,并且直至15:53分结束熔断处理,并调整为半开启状态;在半开启状态中累计多次的调用服务已成功之后,又调整为关闭状态。最后,预设远程服务的调用结果呈现正常。
[0142]
基于上述方法实施例,本技术实施例还提供了一个装置实施例,具体如图3所示的一种基于python语言的熔断处理装置300的结构示意图。其中,该装置300包括如下模块。
[0143]
第一确定模块310,用于从预先创建的多个python装饰器中确定目标装饰器,每个python装饰器用于执行一种熔断策略,熔断策略用于表征不同熔断状态间的切换规则。
[0144]
第二确定模块320,用于响应于针对预设远程服务的调用指令,确定预设远程服务的当前熔断状态。
[0145]
判断模块330,用于根据当前熔断状态发起调用,并根据当前熔断状态、调用结果以及目标装饰器执行的目标熔断策略判断是否切换当前熔断状态。
[0146]
可选的,不同的熔断策略依据不同类型的参数表征不同熔断状态间的切换规则;其中,目标熔断策略对应的目标类型的参数为以下任一种:响应时长、设备运行数据、响应结果、预设时间内的响应结果。
[0147]
可选的,当前熔断状态为关闭状态;判断模块330在根据当前熔断状态发起调用,并根据当前熔断状态、调用结果以及目标装饰器执行的目标熔断策略判断是否切换当前熔断状态中,具体用于:
[0148]
向预设远程服务发起远程调用,并根据目标类型的参数确定调用结果,调用结果用于指示目标类型的参数是否匹配第一参数值。若确定调用结果触发目标熔断策略中的第一切换规则,则将当前熔断状态由关闭状态切换至开启状态;第一切换规则包括:目标类型的参数匹配第一参数值,或者目标类型的参数匹配第一参数值的累计次数达到第一预设次数。
[0149]
可选的,当前熔断状态为半开启状态;判断模块330在根据当前熔断状态发起调用,并根据当前熔断状态、调用结果以及目标装饰器执行的目标熔断策略判断是否切换当前熔断状态中,具体用于
[0150]
向预设远程服务发起远程调用,并根据目标类型的参数确定调用结果,调用结果用于指示目标类型的参数是否匹配第二参数值。若确定调用结果触发目标熔断策略中的第二切换规则,则将当前熔断状态由半开启状态切换至开启状态;第二切换规则包括:目标类
型的参数匹配第二参数值,或者目标类型的参数匹配第二参数值的累计次数达到第二预设次数。若确定调用结果触发目标熔断策略中的第三切换规则,则将当前熔断状态由半开启状态切换至关闭状态;第三切换规则包括:目标类型的参数不匹配第二参数值,或者目标类型的参数不匹配第二参数值的累计次数达到第三预设次数。
[0151]
可选的,当前熔断状态为开启状态;判断模块330在根据当前熔断状态发起调用,并根据当前熔断状态、调用结果以及目标装饰器执行的目标熔断策略判断是否切换当前熔断状态中,具体用于:
[0152]
向与预设远程服务相适配的兜底服务发起调用,以便拦截对预设远程服务的调用;兜底服务为本地服务。将当前的累计拦截时间和/或累计拦截次数作为调用结果。若确定调用结果触发目标熔断策略中的第四切换规则,则将当前熔断状态由开启状态切换至半开启状态;第四切换规则包括:累计拦截时间不小于预设拦截时间阈值,和/或,累计拦截次数不小于预设拦截次数阈值。
[0153]
可选的,第一确定模块310在目标装饰器的创建过程中,具体用于:
[0154]
获取由python语言编写目标装饰器的逻辑代码,逻辑代码中包括缺省部位;将目标熔断策略所依据的目标类型的参数对应的切换条件输入缺省部位;通过编译操作得到目标装饰器。
[0155]
可选的,第二确定模块320还可以用于:
[0156]
响应于针对预设远程服务的调用指令,设置预设数量的采集窗口,采集窗口的时间长度为预设单位时长;通过预设数量的采集窗口采集调用指令的响应结果,以便为各熔断状态间的切换提供数据依据。
[0157]
可选的,装置300还包括展示模块340,具体用于:
[0158]
统计预设时间内针对预设远程服务的调用结果;调用结果包括调用服务已成功、调用服务已失败、已拦截服务调用和未知调用。根据每一调用结果的统计结果进行数据展示。
[0159]
本技术实施例的装置可执行本技术实施例所提供的方法,其实现原理相类似,本技术各实施例的装置中的各模块所执行的动作是与本技术各实施例的方法中的步骤相对应的,对于装置的各模块的详细功能描述具体可以参见前文中所示的对应方法中的描述,此处不再赘述。
[0160]
本技术实施例中提供了一种电子设备,包括存储器、处理器及存储在存储器上的计算机程序,该处理器执行上述计算机程序以实现一种基于python语言的熔断处理方法的步骤,与相关技术相比可实现:通过布局多个熔断策略以适应不同场景的目的,并且还可以在避免修改原代码的基础上通过新增python装饰器的手段来适应场景的变化,最终实现减少开发人员的工作量的目的。
[0161]
在一个可选实施例中提供了一种电子设备,如图4所示,图4所示的电子设备4000包括:处理器4001和存储器4003。其中,处理器4001和存储器4003相连,如通过总线4002相连。可选地,电子设备4000还可以包括收发器4004,收发器4004可以用于该电子设备与其他电子设备之间的数据交互,如数据的发送和/或数据的接收等。需要说明的是,实际应用中收发器4004不限于一个,该电子设备4000的结构并不构成对本技术实施例的限定。
[0162]
处理器4001可以是cpu(central processing unit,中央处理器),通用处理器,
dsp(digital signal processor,数据信号处理器),asic(application specific integrated circuit,专用集成电路),fpga(field programmable gate array,现场可编程门阵列)或者其他可编程逻辑器件、晶体管逻辑器件、硬件部件或者其任意组合。其可以实现或执行结合本技术公开内容所描述的各种示例性的逻辑方框,模块和电路。处理器4001也可以是实现计算功能的组合,例如包含一个或多个微处理器组合,dsp和微处理器的组合等。
[0163]
总线4002可包括一通路,在上述组件之间传送信息。总线4002可以是pci(peripheral component interconnect,外设部件互连标准)总线或eisa(extended industry standard architecture,扩展工业标准结构)总线等。总线4002可以分为地址总线、数据总线、控制总线等。为便于表示,图4中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
[0164]
存储器4003可以是rom(read only memory,只读存储器)或可存储静态信息和指令的其他类型的静态存储设备,ram(random access memory,随机存取存储器)或者可存储信息和指令的其他类型的动态存储设备,也可以是eeprom(electrically erasable programmable read only memory,电可擦可编程只读存储器)、cd-rom(compact disc read only memory,只读光盘)或其他光盘存储、光碟存储(包括压缩光碟、激光碟、光碟、数字通用光碟、蓝光光碟等)、磁盘存储介质、其他磁存储设备、或者能够用于携带或存储计算机程序并能够由计算机读取的任何其他介质,在此不做限定。
[0165]
存储器4003用于存储执行本技术实施例的计算机程序,并由处理器4001来控制执行。处理器4001用于执行存储器4003中存储的计算机程序,以实现前述方法实施例所示的步骤。
[0166]
其中,电子设备包括但不限于:服务器。
[0167]
本技术实施例提供了一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,计算机程序被处理器执行时可实现前述方法实施例的步骤及相应内容。
[0168]
本技术实施例还提供了一种计算机程序产品,包括计算机程序,计算机程序被处理器执行时可实现前述方法实施例的步骤及相应内容。
[0169]
本技术的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”、“1”、“2”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本技术的实施例能够以除图示或文字描述以外的顺序实施。
[0170]
应该理解的是,虽然本技术实施例的流程图中通过箭头指示各个操作步骤,但是这些步骤的实施顺序并不受限于箭头所指示的顺序。除非本文中有明确的说明,否则在本技术实施例的一些实施场景中,各流程图中的实施步骤可以按照需求以其他的顺序执行。此外,各流程图中的部分或全部步骤基于实际的实施场景,可以包括多个子步骤或者多个阶段。这些子步骤或者阶段中的部分或全部可以在同一时刻被执行,这些子步骤或者阶段中的每个子步骤或者阶段也可以分别在不同的时刻被执行。在执行时刻不同的场景下,这些子步骤或者阶段的执行顺序可以根据需求灵活配置,本技术实施例对此不限制。
[0171]
以上所述仅是本技术部分实施场景的可选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本技术的方案技术构思的前提下,采用基于本技术技术思
想的其他类似实施手段,同样属于本技术实施例的保护范畴。
技术特征:
1.一种基于python语言的熔断处理方法,其特征在于,所述方法包括:从预先创建的多个python装饰器中确定目标装饰器,每个python装饰器用于执行一种熔断策略,所述熔断策略用于表征不同熔断状态间的切换规则;响应于针对所述预设远程服务的调用指令,确定所述预设远程服务的当前熔断状态;根据当前熔断状态发起调用,并根据当前熔断状态、调用结果以及所述目标装饰器执行的目标熔断策略判断是否切换当前熔断状态。2.根据权利要求1所述的方法,其特征在于,不同的熔断策略依据不同类型的参数表征所述不同熔断状态间的切换规则;其中,所述目标熔断策略对应的目标类型的参数为以下任一种:响应时长、设备运行数据、响应结果、预设时间内的响应结果。3.根据权利要求2所述的方法,其特征在于,所述当前熔断状态为关闭状态;所述根据当前熔断状态发起调用,并根据当前熔断状态、调用结果以及所述目标装饰器执行的目标熔断策略判断是否切换当前熔断状态,包括:向所述预设远程服务发起远程调用,并根据所述目标类型的参数确定调用结果,所述调用结果用于指示所述目标类型的参数是否匹配第一参数值;若确定所述调用结果触发所述目标熔断策略中的第一切换规则,则将所述当前熔断状态由所述关闭状态切换至开启状态;所述第一切换规则包括:所述目标类型的参数匹配第一参数值,或者所述目标类型的参数匹配第一参数值的累计次数达到第一预设次数。4.根据权利要求2所述的方法,其特征在于,所述当前熔断状态为半开启状态,所述根据当前熔断状态发起调用,并根据当前熔断状态、调用结果以及所述目标装饰器执行的目标熔断策略判断是否切换当前熔断状态,包括:向所述预设远程服务发起远程调用,并根据所述目标类型的参数确定调用结果,所述调用结果用于指示所述目标类型的参数是否匹配第二参数值;若确定所述调用结果触发所述目标熔断策略中的第二切换规则,则将所述当前熔断状态由所述半开启状态切换至开启状态;所述第二切换规则包括:所述目标类型的参数匹配所述第二参数值,或者所述目标类型的参数匹配第二参数值的累计次数达到第二预设次数;若确定所述调用结果触发所述目标熔断策略中的第三切换规则,则将所述当前熔断状态由所述半开启状态切换至关闭状态;所述第三切换规则包括:所述目标类型的参数不匹配第二参数值,或者所述目标类型的参数不匹配第二参数值的累计次数达到第三预设次数。5.根据权利要求2所述的方法,其特征在于,所述当前熔断状态为开启状态;所述根据当前熔断状态发起调用,并根据当前熔断状态、调用结果以及所述目标装饰器执行的目标熔断策略判断是否切换当前熔断状态,包括:向与所述预设远程服务相适配的兜底服务发起调用,以便拦截对所述预设远程服务的调用;所述兜底服务为本地服务;将当前的累计拦截时间和/或累计拦截次数作为所述调用结果;若确定所述调用结果触发所述目标熔断策略中的第四切换规则,则将所述当前熔断状态由所述开启状态切换至半开启状态;所述第四切换规则包括:所述累计拦截时间不小于
预设拦截时间阈值,和/或,所述累计拦截次数不小于预设拦截次数阈值。6.根据权利要求1-5任一项所述的方法,其特征在于,所述目标装饰器的创建过程包括:获取由python语言编写所述目标装饰器的逻辑代码,所述逻辑代码中包括缺省部位;将所述目标熔断策略所依据的目标类型的参数对应的切换条件输入所述缺省部位;通过编译操作得到所述目标装饰器。7.根据权利要求1-5任一项所述的方法,其特征在于,所述方法包括:响应于针对预设远程服务的调用指令,设置预设数量的采集窗口,所述采集窗口的时间长度为预设单位时长;通过所述预设数量的采集窗口采集所述调用指令的响应结果,以便为各熔断状态间的切换提供数据依据。8.根据权利要求1-5任一项所述的方法,其特征在于,所述方法包括:统计预设时间内针对所述预设远程服务的调用结果;所述调用结果包括调用服务已成功、调用服务已失败、已拦截服务调用和未知调用;根据每一调用结果的统计结果进行数据展示。9.一种基于python语言的熔断处理装置,其特征在于,包括:第一确定模块,用于从预先创建的多个python装饰器中确定目标装饰器,每个python装饰器用于执行一种熔断策略,所述熔断策略用于表征不同熔断状态间的切换规则;第二确定模块,用于响应于针对预设远程服务的调用指令,确定所述预设远程服务的当前熔断状态;判断模块,用于根据当前熔断状态发起调用,并根据当前熔断状态、调用结果以及所述目标装饰器执行的目标熔断策略判断是否切换当前熔断状态。10.一种电子设备,包括存储器、处理器及存储在存储器上的计算机程序,其特征在于,所述处理器执行所述计算机程序以实现权利要求1-8任一项所述方法的步骤。11.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1-8任一项所述方法的步骤。12.一种计算机程序产品,包括计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1-8任一项所述方法的步骤。
技术总结
本申请实施例提供了一种基于Python语言的熔断处理方法、装置、设备、介质及产品,涉及Python开发领域。该方法包括:从预先创建的多个Python装饰器中确定目标装饰器,每个Python装饰器用于执行一种熔断策略,熔断策略用于表征不同熔断状态间的切换规则;响应于针对预设远程服务的调用指令,确定预设远程服务的当前熔断状态;根据当前熔断状态发起调用,并根据当前熔断状态、调用结果以及目标装饰器执行的目标熔断策略判断是否切换当前熔断状态。本申请实施例所示的方案既可以通过布局多个熔断策略以适应不同场景的目的,并且还可以在避免修改原代码的基础上通过新增Python装饰器的手段来适应场景的变化,最终实现减少开发人员的工作量的目的。的工作量的目的。的工作量的目的。
技术研发人员:单赟吉 马丽萍
受保护的技术使用者:北京淘友天下技术有限公司
技术研发日:2023.01.12
技术公布日:2023/7/13
版权声明
本文仅代表作者观点,不代表航空之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)
飞行汽车 https://www.autovtol.com/
