You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PR切换至DR后,如何从目标端通知客户端重置TCP连接?

问题场景

我们有一个关联ALB的域名(如https://api.example.com),仅处理服务间(S2S)调用。DR环境所有组件(含ALB)已就绪,但从主环境切换到DR后,两小时内仍有请求持续流向主ALB。

根因分析

客户端基于Golang开发,依赖连接池维持长时活跃的持久连接,导致域名解析切换到DR的ALB IP后,现有连接仍绑定主ALB,未自动重建。尝试过的无效方案包括:

  • 服务器端重置连接:因ALB工作在7层,该操作无法触达客户端
  • 返回5XX/4XX错误:无法强制Golang客户端主动重建连接
解决方案

服务端(Java 8)主动触发连接重置

Golang HTTP客户端原生支持Connection: close响应头,收到该头后会立即关闭当前连接,后续请求会重新解析域名并建立新连接。Java服务端可在切换到DR后的窗口期内临时添加该响应头:

// 在Servlet或Spring MVC的响应逻辑中添加
response.setHeader("Connection", "close");
  • 建议窗口期设置为30分钟左右,覆盖所有客户端的活跃连接周期即可,之后可恢复正常响应头配置。

客户端(Golang)优化连接池配置(可选)

若允许修改客户端代码,可调整连接池的空闲超时时间,避免连接长时间存活:

import (
    "net/http"
    "time"
)

func init() {
    transport := http.DefaultTransport.(*http.Transport)
    // 限制单主机空闲连接数,避免过多旧连接堆积
    transport.MaxIdleConnsPerHost = 100
    // 设置空闲连接超时,远小于之前的2小时
    transport.IdleConnTimeout = 15 * time.Minute
}

配合DNS TTL优化

将域名TTL设置为较短时间(如5分钟),确保客户端在连接过期后能快速获取DR环境的ALB IP,加速流量切换。

验证方式

切换到DR后,观察主ALB流量是否在短时间内下降、DR ALB流量同步上升;同时检查Golang客户端的连接日志,确认连接在收到Connection: close响应后被关闭并重建。

内容的提问来源于stack exchange,提问作者Ankur Bajwa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 02:04:59