Categories: 业界

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

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

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

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

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

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

关闭状态

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

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

打开状态

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

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

半开放状态

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

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

通常,当我们使用任何体系结构(微服务/单片)开发系统或应用程序时,我们向客户保证,应用程序可用性将达到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请求。这意味着现在我们处于断路器模式的“半开”状态。如果这些请求成功,断路器将允许再次发送该服务的请求。

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

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

嘻嘻IT: 笔者是一个工作七八年的程序猿老鸟,从事涉及的技术栈主要包括PHP、Linux、Devops等,喜欢研究新技术,尝试新技术,提升技术自动化和开发效率,致力于write less,do more! 技术每年都会层出不穷,领域划分的越来越细,不可能学习所有的东西,保持对技术的好奇心,理解技术中核心思想,做一个有深度,有思想的开发!

Recent Posts

liunux中你必须知道alias命令?

在Linux操作系统中,无论你…

2小时 ago

zshrc文件详解

Zsh 是一个强大的 shel…

15小时 ago

IPKings一款优秀的HTTP/Socks5代理服务-最低1.49$每月

IPKings是一家提供可靠、…

17小时 ago

SSH频繁掉线如何解决?

SSH持久连接非常有用,因为它…

18小时 ago