案例/假设:
- 有其他人写的服务器。
- 该服务器具有端点
GET /api/watch
。 - 此端点是普通的http/1.1
- 此端点将像
一旦出现响应流(每行一个事件,然后是齐平)。{type:"foo", message:"bar"}
- 有时该服务器每秒都会将活动写入输出,有时每15分钟每15分钟。
- 在我的客户端和该服务器之间,有第三方负载平衡器,如果连接在连接上没有操作超过60秒,则假定连接为Stalancer,并在不关闭连接的情况下将连接丢弃。
- 客户用简单的golang编写,简单地提出了该端点的请求。
- 一旦连接被LB标记为已安置为客户端(
curl
也发生了同样的情况),未通知连接由LB删除,并且仍在等待在Get Request的响应中收到的东西。
so:我有什么可能处理这种情况?
不可能:
- 修改服务器。
- 使用另一台服务器。
- 使用此端点以外的其他内容及其编写方式。
- 修改负载平衡器。
- 使用另一磅。
- 将LB排除在连接之外。
15分钟对于基本HTTP来说是一个非常长的安静时期 - 可能更适合Websocket。除了协议更改之外,您应该能够调整负载平衡器上的超时期(由于您没有指定LB是什么),以更好地适合您的用例所有负载平衡器将允许超时高达15分钟。如果您不能更改协议和无法将超时升高到足够高的位置,则必须经常从服务器发送keepalive消息(仅在超时时间内,所以也许是55s使用您当前的配置,或者比您可以在LB上设置的最高超时期。这必须是客户知道要丢弃的东西,例如{"type": "keepalive"}
-在客户端很容易识别为"假"消息,以供守护目的。