可靠:断路器模式

背景

你已经使用了微服务架构。有时服务结合起来处理请求。当一个服务同步条用另一个服务时,总有肯呢个出现其他服务不可用或者出现很高的延迟而基本不可用。前一个服务的资源,比如线程,可能在等待其他服务的响应时被占用。一个服务的失败潜在的级联影响到应用中其他服务的吞吐量。

问题

如何阻止网络或服务的失效级联影响到其他的服务?

限制

解决方案

服务客户端应该通过一层代理访问远程服务,这个店里提供了类似电路断路器的功能。当连续失败的次数超出阈值,断路器跳闸,在一个超时周期范围内所有尝试请求远程服务的请求都快速失败。当超时时间到达后,断路器允许一定数量的测试请求通过。如果这些请求成功,断路器恢复正常操作。否则,如果出现失败,则上述超时周期又重新开始。

示例

微服务示例应用 中的 RegistrationServiceProxy 是一个示例组件,采用Scala编写,使用断路器处理调用远程服务的失败。

@Component
class RegistrationServiceProxy @Autowired()(restTemplate: RestTemplate) extends RegistrationService {

  @Value("${user_registration_url}")
  var userRegistrationUrl: String = _

  @HystrixCommand(commandProperties=Array(new HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds", value="800")))
  override def registerUser(emailAddress: String, password: String): Either[RegistrationError, String] = {
    try {
      val response = restTemplate.postForEntity(userRegistrationUrl,
        RegistrationBackendRequest(emailAddress, password),
        classOf[RegistrationBackendResponse])
      response.getStatusCode match {
        case HttpStatus.OK =>
          Right(response.getBody.id)
      }
    } catch {
      case e: HttpClientErrorException if e.getStatusCode == HttpStatus.CONFLICT =>
        Left(DuplicateRegistrationError)
    }
  }
}

@HystrixCommand 安排了使用断路器来处理对 registerUser() 的调用。

通过在 UserRegistrationConfiguration 类上添加 @EnableCircuitBreaker 模式,启用断路器功能。

@EnableCircuitBreaker
class UserRegistrationConfiguration {

结果

这个模式有如下优势:

  • 服务处理了它们调用远程服务产生的错误

这个模式有如下问题:

  • 选择合适的超时时间,不带来误报或引入更多的延迟,是有挑战性的。

相关模式

参见

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容