详情请进入 湖南阳光电子学校 已关注:人 咨询电话:0731-85579057 微信号:yp941688, yp94168
软件系统对运行在手机维修与不同进程或者网路中不同的手机维修机器的手机维修软件进行远程调用是很常见的手机维修。内存中调用手机维修和远程调用之间的手机维修一个主要区别是,远程调用可能会失败,或者在手机维修与达到某个超时限制之前挂起而没有响应。更糟糕的手机维修是,如果一个响应延迟的手机维修服务提供方上有许多调用者,那么您可能会耗尽关键资源,导致跨多个系统的手机维修连锁故障。michael nygard在手机维修与他的手机维修优秀著作《发布》中推广了断路器模式,以防止这种灾难性的手机维修连锁故障。
断路器的手机维修基本原理很简单。您将一个受保护的手机维修函数调用封装在手机维修与一个断路器对象中,该断路器对象监视故障。一旦故障达到某个阈值,断路器就会跳闸,所有对断路器的手机维修继续调用都会返回一个错误,受保护的手机维修调用也不会继续。如果断路器跳闸,您通常还需要通过监视器进行警报。
下面是ruby写的手机维修一个简单示例,用于防止超时。
我使用block (lambda)设置了断路器,它是受保护的手机维修调用。
cb = circuitbreaker.new {|arg| @supplier.func arg}
断路器存储block,初始化各种参数(阈值、超时手机维修和监视功能),并将断路器重置为关闭状态。
class circuitbreaker...
attr_accessor :invocation_timeout, :failure_threshold, :monitor
def initialize &block
@circuit = block
@invocation_timeout = 0.01
@failure_threshold = 5
@monitor = acquire_monitor
reset
end
如果线路关闭,则调用断路器将调用底层block,如果打开则返回错误
# client code
acircuitbreaker.call(5)
class circuitbreaker...
def call args
case state
when :closed
begin
do_call args
rescue timeout::error
record_failure
raise $!
end
when :open then raise circuitbreaker::open
else raise "unreachable code"
end
end
def do_call args
result = timeout::timeout(@invocation_timeout) do
@circuit.call args
end
reset
return result
end
如果我们调用超时,,我们故障计数器计数增加,调用成功则将其重置为零。
class circuitbreaker...
def record_failure
@failure_count += 1
@monitor.alert(:open_circuit) if :open == state
end
def reset
@failure_count = 0
@monitor.alert :reset_circuit
end
将故障失败数与阈值进行比较,确定断路器的手机维修状态
class circuitbreaker...
def state
(@failure_count >= @failure_threshold) ? :open : :closed
end
这个简单的手机维修断路器避免了在手机维修与电路打开时进行调用,但是当一切恢复正常时需要外部干预来重置它。对于建筑物中的手机维修断路器,这是一种合理的手机维修方法,但是对于软件中断路器,我们可以让断路器本身检测底层调用是否可以继续。我们可以通过在手机维修与适当的手机维修间隔之后再次尝试被保护调用来实现这种自重置行为,成功时则重置断路器。
创建这种断路器意味着需要为重置尝试添加一个阈值,并设置一个变量来保存上次错误时间。
class resetcircuitbreaker...
def initialize &block
@circuit = block
@invocation_timeout = 0.01
@failure_threshold = 5
@monitor = breakermonitor.new
@reset_timeout = 0.1
reset
end
def reset
@failure_count = 0
@last_failure_time = nil
@monitor.alert :reset_circuit
end
现在手机维修与出现了第三种状态—半开放状态—这意味着线路已经准备好进行试验性的手机维修真实调用,看看问题是否已经修复。
class resetcircuitbreaker...
def state
case
when (@failure_count >= @failure_threshold) &&
(time.now - @last_failure_time) > @reset_timeout
:half_open
when (@failure_count >= @failure_threshold)
:open
else
:closed
end
end
在手机维修与半打开状态下的手机维修试验性调用,如果成功,将重置断路器;如果失败,将重启超时设置。
class resetcircuitbreaker...
def call args
case state
when :closed, :half_open
begin
do_call args
rescue timeout::error
record_failure
raise $!
end
when :open
raise circuitbreaker::open
else
raise "unreachable"
end
end
def record_failure
@failure_count += 1
@last_failure_time = time.now
@monitor.alert(:open_circuit) if :open == state
end
这个例子很简单,在手机维修与实践中断路器提供了更多的手机维修特性手机维修和参数化设置。它们通常会防止受保护调用可能引发的手机维修一系列错误,比如网络连接失败。并不是所有的手机维修错误都应该跳闸,有些是反映正常的手机维修故障,需要作为常规逻辑的手机维修一部分进行处理。
由于流量很大,您可能会遇到大量调用等待超时的手机维修问题。由于远程调用通常很慢,所以 好将每个调用放在手机维修与不同的手机维修线程上,使用future或promise来处理返回的手机维修结果。从线程池中提取这些线程,在手机维修与线程池耗尽时介绍线路断开。
这个例子展示了一种简单的手机维修方法来跳闸—在手机维修与成功调用时重置计数。一种更复杂的手机维修方法可能是查看错误的手机维修频率,比如,一旦达到50%的手机维修失败率,就会跳闸。您还可以为不同的手机维修错误设置不同的手机维修阈值,例如超时阈值为10,连接失败阈值为3。
我所展示的手机维修示例是用于同步调用的手机维修断路器,但是断路器对于异步通信也很有用。这里的手机维修一种常见技术是将所有请求放在手机维修与一个队列中,服务提供者以一定速度消费该队列—这是一种避免服务器过载的手机维修有用技术。在手机维修与这种情况下,当队列被填满时,线路就会断开。
就其本身而言,断路器有助于减少在手机维修与可能失败的手机维修操作中占用资源。您可以避免客户端的手机维修超时等待,而断开的手机维修线路也可以避免给处于困境的手机维修服务器增加负载。我在手机维修与这里讨论的手机维修是远程调用,这是使用断路器的手机维修常见情况,但是它们可以用于任何需要保护系统部件免受其他部件故障影响的手机维修情况。
断路器是一个有价值的手机维修监测点。断路器中状态的手机维修任何更改都应该被记录,断路器应该显示其状态的手机维修详细信息,以便进行更深入的手机维修监控。断路器的手机维修行为通常是一个很好的手机维修来源,来警告环境中更深层次的手机维修问题。操作人员应该能够跳闸或复位断路器。
断路器本身是有价值的手机维修,但使用断路器的手机维修客户端需要对断路器故障做出反应。与任何远程调用一样,您需要考虑在手机维修与发生故障时应该做什么。它是否会使你正在手机维修与进行的手机维修操作失败,或者是否还有其他的手机维修解决办法?比如信用卡授权可以放在手机维修与队列中稍后处理;通过显示一些可以接受的手机维修旧数据来缓解无法获取某些数据的手机维修问题。
致谢
pavel shpak在手机维修与示例代码中发现报告了一个bug
。清河门修手机培训学校,到哪里学手机维修,清河门学修手机的学校,清河门修手机培训哪里好,清河门修手机培训学校,清河门修手机短期培训班,清河门修手机培训学校地址,清河门学修手机培训,清河门修手机培训哪里好,清河门修手机培训班,清河门修手机技术培训.(编辑:hnygdzxx888)
(整理:清河门修手机培训学校)
湖南阳光电子学校教学特色