如何配置超时?

Envoy 支持各种超时,可能需要根据部署进行配置。此页面总结了各种场景中使用的最重要的超时。

注意

这不是 Envoy 支持的所有可配置超时的详尽列表。根据部署,可能需要额外的配置。

HTTP/gRPC

连接超时

连接超时适用于整个 HTTP 连接以及连接承载的所有流。

  • HTTP 协议 idle_timeout 在 HTTP 连接管理器和上游集群 HTTP 连接都使用的通用消息中定义。空闲超时是下游或上游连接在没有活动流的情况下将被终止的时间。如果未指定,默认空闲超时为 *1 小时*。要修改下游连接的空闲超时,请使用 common_http_protocol_options HTTP 连接管理器配置中的字段。要修改上游连接的空闲超时,请使用 common_http_protocol_options 集群的 extension_protocol_options 中的字段,以 HttpProtocolOptions 为键。

  • HTTP 协议 max_connection_duration 在 HTTP 连接管理器和上游集群 HTTP 连接都使用的通用消息中定义。最大连接持续时间是从连接首次建立起,下游或上游连接将被排空和/或关闭的时间。如果没有活动流,连接将被关闭。如果有任何活动流,排空序列将启动,并且连接将在排空时间段后强制关闭。最大连接持续时间的默认值为 *0* 或无限制,这意味着连接永远不会因为老化而关闭。这在运行一组 Envoy 边缘代理并希望在一段时间后关闭下游连接以防止粘性时可能很有用。它还可以帮助更好地将整体流量均衡到此池中,尤其是当此池的大小动态变化时。最后,当使用解析的地址可能发生更改(即使上游保持健康)的 DNS 名称时,它可能有助于上游连接。在这种情况下,强制执行最大上游生命周期可以防止保留健康的连接,即使它们原本无法发现。要修改下游连接的最大连接持续时间,请使用 common_http_protocol_options HTTP 连接管理器配置中的字段。要修改上游连接的最大连接持续时间,请使用 common_http_protocol_options 集群配置中的字段。

有关其他连接超时的信息,请参见下方

流超时

流超时适用于 HTTP 连接承载的各个流。请注意,流是 HTTP/2 和 HTTP/3 概念,但是 Envoy 内部将 HTTP/1 请求映射到流,因此在此上下文中请求/流是可互换的。

  • HTTP 连接管理器 request_timeout 是连接管理器允许从客户端接收 *整个请求流* 的时间量。

    注意

    默认情况下不强制执行此超时,因为它与流式请求(永不结束的请求)不兼容。请参见接下来的流空闲超时。但是,如果使用 缓冲区过滤器,建议配置此超时。

  • HTTP 连接管理器 request_headers_timeout 确定客户端必须发送 *仅标头* 在请求流上的时间量,然后再取消流。这可以用来防止客户端通过创建大量主要处于空闲状态的流来消耗太多内存,这些流正在等待标头。默认情况下,请求标头超时被禁用。

  • HTTP 连接管理器 stream_idle_timeout 是连接管理器允许流存在而没有上游或下游活动的时间量。默认流空闲超时为 *5 分钟*。此超时强烈建议用于所有请求(不仅仅是流式请求/响应),因为它还防御了在整个响应被缓冲以发送到下游客户端后不会打开流窗口的对等方。

  • HTTP 协议 max_stream_duration 在 HTTP 连接管理器使用的通用消息中定义。最大流持续时间是流生命周期跨越的最大时间。当您想要定期重置 HTTP 请求/响应流时,可以使用此功能。您不能在这种情况下使用 request_timeout,因为如果在请求/响应流上收到响应标头,此计时器将被解除武装。此超时在上游和下游连接上都可用。

路由超时

Envoy 在路由级别支持额外的流超时,以及覆盖前面介绍的一些流超时。

  • 路由 timeout 是 Envoy 等待上游响应完整响应的时间量。*此超时直到整个下游请求流被接收后才开始*。

    注意

    此超时默认为 *15 秒*,但是,它与流式响应(永不结束的响应)不兼容,需要禁用。流空闲超时应在流式 API 的情况下使用,如本页其他地方所述。

  • 路由 idle_timeout 允许覆盖 HTTP 连接管理器 stream_idle_timeout 并执行相同的操作。

  • 路由 per_try_timeout 在使用重试时可以配置,以便使用比上面描述的整体请求超时更短的超时的各个尝试。此超时仅在响应的任何部分发送到下游之前应用,这通常发生在上游发送响应标头之后。此超时可用于流式端点,如果上游在超时时间内无法开始响应,则重试。

  • 路由 per_try_idle_timeout 可以配置以确保各个重试尝试(包括第一次尝试)的响应持续进行。这在总上游请求时间受尝试次数乘以每次尝试超时限制,但用户希望确保各个尝试正在取得进展的情况下很有用。

  • 路由 MaxStreamDuration proto 可用于覆盖 HttpConnectionManager 的 max_stream_duration 用于单个路由,以及在 grpc-timeout 标头上设置限制和固定时间偏移。

缩放超时

在 Envoy 负载较重的情况下,Envoy 可以使用动态调整的超时时间来动态配置超时时间。Envoy 通过 超载管理器 支持动态调整超时时间,该管理器在 Envoy 启动配置 中配置。使用 缩短超时时间 超载操作,可以配置超载管理器来监控 资源 并相应地调整超时时间。例如,一个常见的用例可能是监控 Envoy 堆大小 并将动态调整的 TimerType 设置为 HTTP_DOWNSTREAM_CONNECTION_IDLE。超载管理器将在达到 缩放阈值 后缩短 空闲超时时间,并在达到 缩放阈值 后将超时时间设置为 最小超时时间。超载管理器支持动态调整的所有定时器的完整列表可在超载管理器 文档 中找到。

TCP

  • 集群 connect_timeout 指定 Envoy 等待上游 TCP 连接建立的时间。如果未设置此值,将使用默认值 5 秒。

    注意

    对于上游 TLS 连接,连接超时时间包括 TLS 握手。对于下游连接,请参阅 下方 了解配置选项。

  • TCP 代理 idle_timeout 是 TCP 代理允许连接在没有上游或下游活动的情况下存在的时间。如果未指定,默认空闲超时时间为 _1 小时_。

  • TCP 协议 idle_timeoutTcpProtocolOptions 中定义,该选项被来自池的所有 TCP 连接使用。空闲超时时间是指在连接未与下游连接关联的情况下,上游连接将被终止的时间。默认值为 _10 分钟_。要禁用空闲超时时间,请明确将 idle_timeout 设置为 0。

传输套接字

  • transport_socket_connect_timeout 指定 Envoy 等待下游客户端完成传输级协商的时间。当在具有 TLS 或 ALTS 传输套接字的过滤器链上配置时,这将限制在建立 TCP 连接后完成加密握手所允许的时间。