如何通过DataPower将WebSocket连接从主集群切换到备用集群
问题根因
WebSocket是基于TCP的长连接协议,握手完成后连接会持续保持,DataPower默认会将首次握手成功的后端节点和该WebSocket连接做持久绑定,后续该连接上的所有数据帧都会直接转发到绑定的后端,不会再重新触发负载均衡、故障转移的判定逻辑,因此主集群故障后已有WebSocket连接不会自动切流,这是非常常见的配置场景问题。
可行解决方案
1. 绑定WebSocket连接与后端健康检测状态
- 在DataPower对应负载均衡组(Load Balancer Group)的配置页,开启 WebSocket连接关联健康状态 选项,开启后已建立的WebSocket连接会和对应后端节点的健康检测结果绑定,一旦检测到主集群节点状态变为Down,DataPower会主动断开对应的存活WebSocket连接
- 配套客户端侧实现WebSocket断连自动重连逻辑,重连后的新请求就会被正常转发到可用的备用集群
注意:该配置仅在DataPower 7.5.2及以上版本支持,低于该版本需要先升级固件后使用
2. 配置WebSocket帧动态路由规则
- 在DataPower的处理策略(Processing Policy)中新增针对WebSocket数据帧的处理规则,使用GatewayScript或XSLT对每一个上行的WebSocket帧做后端目标的动态判定
- 每次处理帧时先调用
dp:get-lb-group-status()接口查询主集群负载均衡组的状态,如果主集群状态异常,直接将当前帧转发到备用集群的负载均衡组,同时重置该连接的后端绑定关系
核心GatewayScript示例:
// 查询主集群负载均衡组状态 var mainLbStatus = dp.getLBGroupStatus('main-cluster-lb'); if(mainLbStatus === 'down') { // 动态修改路由目标到备集群负载均衡组 dp.setVariable('var://service/routing-url', 'dp://lbgroup/backup-cluster-lb'); }
3. 配置WebSocket连接最大存活时长兜底
- 在DataPower对应的HTTP/HTTPS服务配置中,设置 WebSocket连接超时时间 为合理值(建议15~60分钟,根据业务场景调整),超时后强制断开已有连接,客户端自动重连后就会接入到正常的集群节点
- 该方案实现成本最低,适合对长连接可用性要求不高、业务可接受短时间连接中断的场景
4. 集群侧主动断连配合
- 主集群节点计划内下线前,主动向所有已建立的WebSocket连接发送
Close控制帧,状态码使用1012(服务重启)或1013(临时故障),触发客户端主动重连 - 该方案可覆盖计划内运维的切流场景,和前面的DataPower侧配置搭配使用可覆盖计划外故障、计划内运维全场景的切流需求
内容的提问来源于stack exchange,提问作者Karan Khanna
相关产品推荐
相关产品推荐

