分布式系统存在高度复杂性的特点,在基础设施、应用逻辑、运维流程等环节都可能存在稳定性风险而导致业务系统的失效。因此构建一个具有容错能力的分布式系统非常重要。本文介绍如何通过ASM设置超时、重试、隔板和熔断机制构建分布式系统的容错能力。

背景信息

容错能力是指系统在部分故障期间,仍然能够继续运行的能力。创建一个可靠的弹性系统会对其中的所有服务提出容错要求。云环境的动态性质要求服务能预见这些失败,并能优雅地响应意外情况。

任何一个服务都有可能存在请求失败的情况,在请求失败的情况下,能够使用适当的后备操作非常重要。一个服务中断可能会引起连锁反应从而导致严重的业务后果,因此构建、运行和测试系统的弹性能力非常必要。ASM提供了超时处理、重试机制、隔板模式和熔断机制容错解决方案,在不修改应用程序任何代码的情况下为应用程序带来了容错能力。

超时处理

原理介绍

当请求上游服务的时候,存在上游服务一直没有响应的现象。您可以设置一个等待时间,到达一个等待时间后,如果上游服务还是没有响应,直接请求失败,不再去等待上游服务。

通过设置超时,可以确保应用程序在后端服务无响应时可以收到错误返回,从而使其能够以适当的回退行为进行处理。超时更改的是发出请求的客户端等待响应的时间,对目标服务的处理行为没有影响。因此这并不意味着请求的操作失败。

解决方案

ASM支持在虚拟服务中为路由设置超时策略来更改超时值,如果Sidecar代理在设置的时间内未收到响应,则该请求将失败。通过这种方式调整超时,所有使用路由的请求都将使用该超时设置。

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: httpbin
spec:
  hosts:
  - 'httpbin'
  http:
  - route:
    - destination:
        host: httpbin
    timeout: 5s

timeout:设置超时时间,如果在设置的时间内请求的服务没有响应,则直接返回错误结果,不再等待。

重试机制

原理介绍

如果某个服务请求另外一个服务失败,例如请求超时、连接超时、服务宕机等一系列可能的错误,可以通过配置重试机制,重新请求该服务。
警告 不能过于频繁地重试或重试过长时间,有可能导致级联的系统故障。如果在服务尝试恢复时进行了大量连接尝试,则其可能会承受更大压力,并且反复的连接尝试可能使服务不堪重负,导致潜在问题变得更加严重。

解决方案

ASM支持使用 虚拟服务定义重试策略,例如以下定义了其他服务请求httpbin应用时,如果httpbin应用无响应或响应失败,会重新请求httpbin应用3次,每次的请求时间为5秒。
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: httpbin
spec:
  hosts:
  - 'httpbin'
  http:
  - route:
    - destination:
        host: httpbin
    retries:
      attempts: 3
      perTryTimeout: 5s
  • attempts:定义重试的次数。
  • perTryTimeout:每次重试的超时时间,单位可以是毫秒(ms)、秒(s)、分钟(m)和小时(h)。

隔板模式

原理介绍

隔板模式指限制某个客户端对目标服务的连接数、访问请求数等,避免对一个服务的过量访问,如果超过配置的阈值,则会断开请求。隔板模式有助于隔离用于服务的资源,并避免级联故障。其中,最大连接数和连接超时时间是对TCP和HTTP都有效的通用连接设置,而每个连接最大请求数和最大请求重试次数仅针对HTTP1.1、HTTP2、GRPC协议的连接生效。 隔板模式

解决方案

ASM支持通过目标规则设置隔板模式,以下目标规则定义了其他服务请求httpbin应用时,最大并发连接数限制为1,每个连接最大请求数为1,最大请求重试次数为1,并且不能在10秒内建立连接的服务会得到503响应。

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: httpbin
spec:
  host: httpbin
  trafficPolicy:
    connectionPool:
      http:
        http1MaxPendingRequests: 1
        maxRequestsPerConnection: 1
      tcp:
        connectTimeout: 10s
        maxConnections: 1
  • http1MaxPendingRequests:最大请求重试次数。
  • maxRequestsPerConnection:每个连接最大请求数。
  • connectTimeout:连接超时时间。
  • maxConnections:最大连接数。

熔断机制

原理介绍

熔断机制指不会重复向无响应的服务发出请求,而是观察在给定时间段内发生的故障数。如果错误率超过阈值,则熔断器将断开请求,并且所有后续请求都将失败,直到熔断器被关闭为止。 熔断

解决方案

ASM支持通过目标规则设置熔断机制,以下目标规则定义了如果其他服务请求httpbin应用时,在5秒内连续3次访问失败,则将在5分钟内断开请求。

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: httpbin
spec:
  host: httpbin
  trafficPolicy:
    outlierDetection:
      consecutiveErrors: 3
      interval: 5s
      baseEjectionTime: 5m
      maxEjectionPercent: 100
  • consecutiveErrors:连续错误数量。
  • interval:移除检测的时间间隔。
  • baseEjectionTime:最小的移除时间长度。
  • maxEjectionPercent:负载均衡池中允许被移除的主机的最大百分比。