断路器

断路器是分布式系统中的一个关键组件。快速失败并尽快将反压施加到下游几乎总是更好的选择。Envoy 网格的主要优势之一是 Envoy 在网络级别强制执行断路器限制,而不是必须独立配置和编码每个应用程序。Envoy 支持各种类型的完全分布式(非协调)断路器

  • 集群最大连接数:Envoy 将建立到上游集群中所有主机的所有连接的最大数量。如果此断路器溢出,upstream_cx_overflow 集群的计数器将递增。所有连接,无论处于活动状态还是正在排空,都计入此限制。即使此断路器已溢出,Envoy 也会确保通过集群负载均衡选择的宿主至少分配了一个连接。这意味着集群的 upstream_cx_active 计数可能高于集群最大连接断路器,上限为 cluster maximum connections + (number of endpoints in a cluster) * (connection pools for the cluster)。此界限适用于跨所有工作线程的连接总和。有关集群可能有多少连接池的详细信息,请参阅 连接池

  • 集群最大挂起请求数:在等待准备好的连接池连接时将排队的请求最大数量。每当没有足够的可用上游连接来立即调度请求时,就会将请求添加到挂起请求列表中。对于 HTTP/2 连接,如果 最大并发流每个连接的最大请求数 未配置,所有请求都将在同一个连接上复用,因此此断路器仅会在没有建立连接时才会被击中。如果此断路器溢出,upstream_rq_pending_overflow 集群的计数器将递增。对于 HTTP/3,与 HTTP/2 的 最大并发流 等效的是 最大并发流

  • 集群最大请求数:在任何给定时间可以向集群中所有主机发出的请求最大数量。如果此断路器溢出,upstream_rq_pending_overflow 集群的计数器将递增。

  • 集群最大活动重试次数:在任何给定时间可以向集群中所有主机发出的重试最大数量。一般来说,我们建议使用 重试预算;但是,如果需要静态断路器,它应该积极地断开重试电路。这样做的目的是允许偶发性故障的重试,但整体重试量不能爆炸并导致大规模级联故障。如果此断路器溢出,upstream_rq_retry_overflow 集群的计数器将递增。

  • 集群最大并发连接池数:可以并发实例化的连接池的最大数量。某些功能,例如 原始源监听器过滤器,可以创建无限数量的连接池。当集群用尽其并发连接池时,它将尝试回收一个空闲的连接池。如果无法回收,则断路器将溢出。这与 集群最大连接数 不同,因为连接池永远不会超时,而连接通常会超时。连接会自动清理;连接池不会。请注意,为了让连接池正常工作,它至少需要一个上游连接,因此该值可能不应大于 集群最大连接数。如果此断路器溢出,upstream_cx_pool_overflow 集群的计数器将递增。

每个断路器限制都是 可配置的,并且在每个上游集群和每个优先级级别上进行跟踪。这允许分布式系统的不同组件独立调整并具有不同的限制。这些断路器的实时状态,包括直到断路器打开之前剩余的资源数量,可以通过 统计信息 来观察。

工作线程共享断路器限制,即如果活动连接阈值为 500,工作线程 1 有 498 个活动连接,则工作线程 2 只能分配 2 个连接。由于实现最终是一致的,因此线程之间的竞争可能会导致限制被潜在超过。

断路器默认启用,并具有适度的默认值,例如每个集群 1024 个连接。要禁用断路器,请将 阈值 设置为允许的最大值。

请注意,在 HTTP 请求的情况下,断路器会导致 x-envoy-overloaded 标头由路由器过滤器设置。