微服务之熔断策略-断路器(Circuit breaker)

你有没有想过,为什么你家里有断路器?如果你的房子是用电供电的,那么一定要有断路器,因为它们控制和保护着你家插座的布线电路。当电力通过主电网时,总是流经这些断路器。因此,如果主电网行为异常,或者如果额外的电力试图流动,则特定断路器将关闭。因此,您房子的内部布线电路将受到保护。因此,断路器的这种行为与断路器(Circuit breaker)设计模式(熔断策略)的工作方式非常相似。

file

断路器模式是微服务体系结构中使用的一种流行设计模式,属于可持续设计模式范畴。在微服务体系结构中,一个服务通常调用其他服务来检索数据,并且下游服务可能会停机。这可能是由于网络连接速度慢、超时或暂时不可用造成的。因此,重试调用可以解决此问题。然而,如果某个特定的微服务上存在严重问题,那么它将在更长的时间内不可用。在这种情况下,请求将持续发送到该服务,因为客户端不知道某个特定服务正在关闭。因此,网络资源将耗尽,性能低下,用户体验差。此外,一个服务的故障可能会导致整个应用程序的级联故障。

因此,可以使用断路器设计模式来克服此问题。在这种模式的帮助下,客户端将通过代理调用远程服务。该代理将基本上起到断路器的作用。因此,当故障数超过阈值数时,断路器将在特定时间段跳闸。然后,所有调用远程服务的尝试都将在此超时期间失败。超时过期后,断路器允许有限数量的测试请求通过它。如果这些请求成功,断路器将恢复正常操作。否则,如果出现故障,超时时间将再次开始。

断路器设计模式有三种状态:

  1. 关闭
  2. 打开
  3. 半开放式

关闭状态

在此状态下,断路器将请求路由到微服务,并统计每个时段的故障数。这意味着它不会出现任何故障。但是,如果某段时间内的故障次数超过阈值,电路将跳闸并移至“打开”状态。

file

调用下游服务正常,断路器处于关闭状态

打开状态

当断路器移动到“打开”状态时,来自微服务的请求将立即失败,并返回异常。但是,超时后,断路器将进入“半开”状态。

file

调用下游服务不正常,断路器处于打开状态

半开放状态

在此状态下,断路器只允许来自微服务的有限数量的请求通过并调用操作。如果这些请求成功,断路器将返回“闭合”状态。但是,如果任何请求再次失败,它将返回到“打开”状态。

file

调用下游服务部分正常,断路器处于打开状态

通常,当我们使用任何体系结构(微服务/单片)开发系统或应用程序时,我们向客户保证,应用程序可用性将达到99.999%。这意味着只有0.001%的机会出现服务宕机。起初,你可能认为我们甚至不必关心这个0.001%。那样的话,我们来算一下。

24 hrs * 365 days = 8760 hours per year
8760 hrs * 60 mins = 525600 minutes per year
525600 mins X 0.001% = 5.256 minutes of downtime

如您所见,非可用性成本的0.001%每年总共需要5.256分钟的停机时间。如果你仍然认为这是可以的,因为它只有5分钟,你仍然是错的。因为说到微服务,我们有多种服务。例如,假设应用程序中有100个微服务。

(5.256 * 100)/ 60 = 8.78 hours of downtime

所以,现在你可以看到它是多么重要。如果您有100个微服务,那么一年中总共需要8.78小时的停机时间。显然,这是完全不能接受的。因此,我们需要更加重视以保护我们的服务。

让我们举一个例子来理解,在微服务体系结构中,我们可以在哪里应用断路器模式。

示例

假设一个Microservices应用程序中有5个不同的服务。每当收到请求时,服务器都会分配一个线程来调用特定的服务。但是,由于某些故障,服务几乎没有延迟,线程正在等待。但是,如果只有一个线程在等待该服务,那么这也没关系。但是,如果该服务是一个要求很高的服务,并且会收到许多请求,那么保留该服务是不好的。因为在一段时间内将为该服务分配更多线程,这些线程将不得不等待。

因此,到达您服务的其余请求将被阻止或排队。尽管服务已恢复,但Web服务器仍在尝试处理队列中的请求。因为Web服务器将永远不会恢复,因为它会连续接收请求。最终,这可能会导致整个应用程序出现级联故障。因此,这种情况将导致服务甚至应用程序崩溃。

解决方案

上述场景是应用断路器模式的完美示例。假设您已经为特定服务定义了阈值,因为它应该在200毫秒内响应。正如我前面提到的,该服务是一个高需求服务,它不断地接收请求。在这种情况下,如果75%的请求达到上限阈值(150ms-200ms),则意味着服务很快就会失败。但是,如果多个请求超过最大阈值(200ms),则表示该服务不再响应。因此,它将故障回复给消费者,并告知此特定服务不可用。因此,如果您还记得此模式的上述状态,现在我们正在从“关闭”状态转移到“打开”状态。

因此,所有到达特定服务的请求都将不再等待。但是,超时后,断路器会在后台向该服务发送ping请求。这意味着现在我们处于断路器模式的“半开”状态。如果这些请求成功,断路器将允许再次发送该服务的请求。

因此,您可以使用断路器模式来提高微服务体系结构的容错性和弹性,并防止故障级联到其他微服务。

makelogo.ai一个AI在线Logo生成工具!
40个Stable Diffusion Logo Prompts(持续更新中)
标签:

发表我的评论

电子邮件地址不会被公开。 必填项已用*标注

55 + 17 =

ajax-loader