高并发性能YUEXIAN INSIGHTS

服务发现变化时,先管住连接代际,再分散重连峰值

面向高并发系统研发、架构与运维负责人,说明服务扩缩容、发布和故障切换中的 DNS 与地址刷新、旧连接排空、重连退避、连接预算及故障验收。

本文目录
先看结论

可直接引用的结论:DNS 变化不等于流量已经切换,实例就绪也不等于能承受同时重连

本文面向使用 DNS、注册中心、Kubernetes Service、网关或客户端负载均衡的研发、架构与运维负责人。服务扩缩容和滚动发布至少包含四个不同状态:发现系统公布哪些地址、客户端何时采用新地址、已有连接何时停止承载请求、下游能以多快速度接受新连接。只缩短 DNS TTL,无法自动关闭已经建立的长连接;只把实例移出就绪列表,也不能证明所有客户端已经收到变化。正确做法是为发现结果建立版本与最后确认值,让旧实例先停止接收新流量并有界排空,再用带抖动的指数退避、建连并发和待处理请求上限分散恢复。验收目标是证明地址增删最终收敛、业务请求不中断或按约定失败、连接总量受控,并且故障恢复不会把新实例、DNS、证书握手或数据库一起压垮。

先按流量入口选择发现与切换边界

连接形态实施重点主要风险
稳定虚拟地址或代理入口客户端只连接稳定入口,由平台更新后端并执行健康检查与排空误以为代理层会自动处理应用在途请求、会话和不可重放操作
无头服务或客户端负载均衡客户端持续接收完整地址集,按连接代际增删后端并限制建连速度只解析首个地址或启动时解析一次,扩容不生效、缩容仍访问旧实例
移动端与公网客户端经稳定网关接入,客户端离线重连使用退避、抖动和版本兼容网络恢复或版本发布后终端同时重连,入口、认证和消息订阅被瞬时压满
数据库与外部依赖通过受控连接池和代理切换,建立独立连接预算与凭据轮换流程应用副本增加后总连接数成倍增长,切换时认证与数据库先耗尽
01

适用边界:先区分服务发现、负载均衡、健康与连接生命周期

服务名能够解析,只证明某个时刻得到了地址;地址在发现集合中,也不证明后端已经预热或适合承载该请求;地址从集合移除,更不等于客户端现有 TCP、HTTP/2、WebSocket 或数据库连接已经消失。四层状态必须分别定义,不能用一次 DNS 查询成功代替切换验收。

Kubernetes 普通 Service 的 DNS 名通常解析为稳定的集群地址,后端变化由平台数据面处理;无头 Service 则把后端 Pod 地址集合交给客户端,平台不再代替客户端做同样的代理负载均衡。选择无头服务或注册中心直连时,客户端必须证明能消费多地址、更新连接和选择可用后端,不能默认系统解析器会替应用完成负载均衡。

本文适用于服务间调用、网关后端、消息或任务工作节点以及有大量长连接的业务。若协议包含固定会话归属、事务、流式传输、设备控制或不可重复副作用,还要单独定义迁移点和补偿;强制断开连接可能比暂时保留旧实例风险更高。

  • 画出名称解析、发现控制面、负载均衡、连接池、后端和最终依赖的完整路径。
  • 记录普通 Service、无头直连、代理入口或外部负载均衡的真实模式。
  • 为短请求、长流、会话和事务分别定义何时允许换后端。
02

诊断取证:用连接代际还原旧地址为什么仍在接收流量

出现发布后偶发超时或旧实例迟迟下不掉时,先保留发现与连接时间线,不要立即重启全部客户端。对一个脱敏调用样本记录服务名、解析或发现版本、返回地址集、选中地址、连接创建时间、协议、复用请求数、实例状态和最终结果,确认问题发生在地址没有更新、地址更新但连接未替换,还是替换后新后端尚未就绪。

同时按客户端版本、实例、可用区和连接代际聚合:发现更新成功与失败、当前地址数、旧地址残留、建连尝试与成功、握手延迟、活跃与排空连接、待处理请求、拒绝、重试和后端接收量。地址或业务主键不应直接成为无限指标标签;具体样本可放入有访问控制的日志或追踪。把 DNS 查询量、注册中心更新、网关配置采用、证书错误和下游连接池放在同一时间轴,避免只看应用错误码。

常见根因包括只在进程启动时解析、库将单个地址绑定到长寿命连接、发现更新覆盖丢失、负缓存或最后确认值处理错误、健康检查早于依赖预热、实例退出顺序不正确,以及所有客户端在同一时刻关闭并重建连接。先确认哪一代客户端仍在使用哪个地址,再决定刷新、排空还是限速,不能用批量重启制造第二次连接峰值。

  • 发现集合、连接集合和实际请求去向可以按同一时间窗对账。
  • 每条连接有创建时间、目标、状态、关闭原因和所属配置版本。
  • 取证覆盖客户端、代理、服务端与最终数据库,不只观察某一层。
03

发现更新:采用完整地址集,也要保留可解释的最后确认值

发现客户端应把一次成功更新视为带版本的完整快照或明确的增删事件,原子替换可选后端,拒绝比当前版本更旧的结果。刷新失败与“权威结果确实为空”必须区分:前者可在明确期限内继续使用最后确认且仍健康的地址,后者如何停止流量要按控制面语义决定,不能把瞬时 DNS 或注册中心错误直接解释为所有后端已下线。

gRPC 官方名称解析资料说明,标准 DNS 客户端可能在连接开始时查找地址并长期维持连接,而可观察的自定义解析器可以持续收到后端变化;官方负载均衡资料也明确区分 pick_first 与连接多个地址的 round_robin。项目应按实际语言和库版本验证解析触发条件、地址集消费、连接复用和负载策略,不把配置名称当成行为证据。

DNS TTL 是缓存记录的有效期,不是连接最大寿命,也不是业务切流倒计时。刷新策略需避免所有实例在整点同时查询,可通过随机提前量、失败退避和本地最后确认值保护解析服务;但缓存时间过长会延迟缩容,过短则增加查询与更新波动。变更证书、端口、协议或身份时,先验证服务名校验和新旧兼容,不能只替换 IP。

  • 成功、失败、空结果、旧版本和部分地址异常有不同状态与处置。
  • 定期刷新带随机分散,控制面故障不会触发无限查询或清空全部可用地址。
  • 按所用运行时和客户端库实测 DNS、注册中心与负载策略,不靠默认猜测。
04

退出与排空:先停止分配新请求,再有界完成在途工作

缩容和滚动发布应先让实例退出新请求选择,再等待代理、发现订阅者和客户端采用变化;随后完成允许继续的在途请求,最后关闭长连接并终止进程。排空必须有最大期限、连接类别和超时后的处置,既不能立即杀死所有在途工作,也不能让僵死会话无限阻塞发布。

普通短请求可在截止时间内完成;HTTP/2 多路复用、WebSocket、流式 RPC、任务消费者和数据库事务要定义各自的拒新、通知、迁移或重试协议。服务器收到退出信号后停止接受新工作,但健康探针、网关摘流、应用拒新和进程终止的时间要协调。客户端对明确的排空提示应选择新连接;对结果未知的写操作先查询最终状态或使用幂等标识,不能无条件换后端重放。

新实例进入流量前先完成配置、证书、连接池和必要缓存预热,并用真实业务就绪条件控制采用。预热也要受预算约束,避免每个新副本同时建立满额数据库连接或批量加载热点。旧实例达到期限后记录未完成请求、流和副作用,按业务规则补偿或人工接手;回滚时不能让已经退出身份或使用旧协议的实例静默恢复写入主责。

  • 排空顺序、最大期限、强制终止条件和回滚步骤写入发布流程。
  • 短请求、长流、事务、消费者和不可重放操作分别定义退出语义。
  • 新实例就绪同时检查应用、证书、缓存和共享依赖,不只检查端口监听。
05

重连保护:指数退避之外,还要限制连接、排队和重试总预算

后端故障、网络恢复或批量发布会让大量客户端同时失去连接。如果每个客户端立即按固定间隔重试,它们会持续同相撞击新实例。gRPC 的官方连接退避协议使用有上限的指数退避和随机抖动,核心目的就是让同时开始的重连分散;项目可按协议和用户体验调整参数,但必须证明失败重试不会越来越同步。

退避只能控制时间,仍要限制每个进程的并发建连、每个后端和集群的总连接、等待连接的请求、并行重试和握手资源。Envoy 官方熔断资料分别提供最大连接、待处理请求、活动请求和重试等边界,说明这些资源应独立受控。应用即使不用 Envoy,也应建立同类预算;当预算耗尽时快速返回可识别的过载结果或进入有界队列,不能用无界排队把连接风暴变成内存事故。

恢复采用分批探测:少量连接成功并完成健康业务后再逐步开放,而不是一成功就让全部客户端复位到最短重试间隔。移动端、小程序、APP 和设备端还要考虑前后台切换、网络恢复和版本差异,由稳定网关吸收海量终端连接,避免终端直接发现内部实例。AI 智能体工具调用与异步任务同样需要复用连接、遵守截止时间和幂等边界,不能在模型重试之外再叠加无预算的传输重试。

  • 连接、待处理请求、活动请求和重试分别设上限与拒绝语义。
  • 指数退避包含随机抖动、最大等待和恢复后逐步放量。
  • 应用副本扩容时核对全局数据库、认证、DNS 与证书握手预算。
06

灰度与验收:证明扩容能被使用、缩容能收敛、故障不会再同步重连

先在一个低风险调用方或服务分区启用发现刷新、连接代际指标和排空,再逐步扩大。每次只改变一组关键行为,保存旧策略作为可回退配置;若协议或身份不兼容,回滚必须连同发现版本、连接池和在途请求处置一起演练,不能只把实例数量调回去。

验收至少覆盖新增后端、删除后端、单实例故障、同批多实例退出、DNS 或注册中心暂时不可用、返回空或旧结果、证书握手失败、网络恢复、客户端重启和共享依赖变慢。观察发现采用延迟、旧地址残留时间、连接建立峰值、握手成功、活跃与排空连接、待处理与拒绝、P95/P99、有效业务完成量和数据库连接。用故障注入控制范围和停止条件,禁止对未授权生产依赖制造全量断连。

业务验收要核对读写结果、幂等标识、会话归属、任务位点和不可逆副作用;流量看似平滑也可能出现重复提交或结果未知。通过条件应写成项目实测边界:地址变化在约定窗口内被采用,退出实例不再获得新请求,在途工作按规则结束,连接与排队不超过预算,恢复期间新实例和共享依赖保持可用。主要风险包括发现脑裂、旧连接永久残留、排空期限过短、重试叠加、连接池按副本成倍放大、证书或协议不兼容,以及观测高基数泄露内部地址。

  • 发布记录包含发现版本、连接代际、排空时间线、停止条件和业务对账。
  • 扩容、缩容、控制面故障与大规模重连使用同一套可复现实验验收。
  • 回滚演练证明旧新客户端、协议、证书和在途副作用均可安全处置。

需求讨论中的问题

把 DNS TTL 调短,就能让流量快速切到新实例吗?

不能保证。TTL 约束的是 DNS 记录缓存,已经建立并复用的连接可能继续指向旧地址。还要验证客户端何时重新解析、如何采用多地址、何时关闭旧连接,以及旧实例如何停止接收新请求。

实例 readiness 变为失败后,可以立即停止进程吗?

通常不应直接假设安全。先确认网关或发现订阅者已经停止分配新请求,再按协议排空在途请求、长流和事务;达到约定期限后才能按业务规则强制终止,并记录未完成副作用。

已经用了连接池,为什么扩容后新实例仍没有流量?

连接池可能长期复用旧连接,客户端负载策略也可能只选择发现结果中的首个地址。应查看发现版本、地址集、连接创建时间与实际请求去向,按库的真实行为设计连接更新或最大寿命,不能只看池大小。

重连使用指数退避后,还需要连接上限吗?

需要。退避分散尝试时间,但客户端数量足够大时,总尝试仍可能超过新实例、TLS、认证或数据库能力。建连、等待请求、活动请求和重试必须分别设上限与过载语义。

小程序、APP 和 AI 智能体如何避免放大连接风暴?

多端经稳定网关接入,终端网络恢复使用带抖动退避和版本兼容;服务端工具调用复用受控连接,统一截止时间、重试预算与幂等标识。不要让终端直接发现内部实例,也不要叠加多层无预算重试。

带走这份清单

服务发现与连接风暴治理验收清单

可逐项勾选,辅助本次阅读;刷新页面后不保留。

参考资料

技术概念可进一步阅读以下资料;文中的业务场景与实施清单用于方案讨论。

  1. Kubernetes Documentation · Service

    核验普通 Service 的稳定入口、EndpointSlice 与数据面关系,以及无头 Service 不提供同样的平台代理和负载均衡、直接发布后端地址的边界。

  2. Kubernetes Documentation · DNS for Services and Pods

    核验普通 Service 与无头 Service 的 DNS 记录差异,以及无头服务由客户端消费多个后端地址的官方说明。

  3. gRPC Documentation · Custom Name Resolution

    核验标准 DNS、可观察式自定义解析器与服务发现的关系,以及长寿命连接不会仅因名称存在就自动采用所有后端的边界。

  4. gRPC Documentation · Custom Load Balancing Policies

    核验名称解析器向负载策略提供地址集,以及 pick_first、round_robin 和后端连接管理职责的官方说明;具体语言支持需按项目版本验证。

  5. gRPC Core · Connection Backoff Protocol

    核验失败连接使用有上限的指数退避与随机抖动,使同时发生的重连尝试分散的协议原则。

  6. Envoy Documentation · Circuit breaking

    核验最大连接、待处理请求、活动请求和并行重试等独立资源边界,以及溢出指标与快速背压语义。

#服务发现#连接风暴#优雅排空#故障切换
从阅读,到行动

需要评估现有系统的性能瓶颈?

提供关键业务路径、真实峰值、服务器与数据库配置,以及现有压测或故障记录,月弦科技可据此梳理优化顺序、实施范围和可验证的验收条件。