如何处理长期运行的服务器响应和加载平衡器将其视为停滞的连接



案例/假设:

  1. 有其他人写的服务器。
  2. 该服务器具有端点GET /api/watch
  3. 此端点是普通的http/1.1
  4. 此端点将像
    {type:"foo", message:"bar"}
    
    一旦出现响应流(每行一个事件,然后是齐平)。
  5. 有时该服务器每秒都会将活动写入输出,有时每15分钟每15分钟。
  6. 在我的客户端和该服务器之间,有第三方负载平衡器,如果连接在连接上没有操作超过60秒,则假定连接为Stalancer,并在不关闭连接的情况下将连接丢弃。
  7. 客户用简单的golang编写,简单地提出了该端点的请求。
  8. 一旦连接被LB标记为已安置为客户端(curl也发生了同样的情况),未通知连接由LB删除,并且仍在等待在Get Request的响应中收到的东西。

so:我有什么可能处理这种情况?

不可能:

  1. 修改服务器。
  2. 使用另一台服务器。
  3. 使用此端点以外的其他内容及其编写方式。
  4. 修改负载平衡器。
  5. 使用另一磅。
  6. 将LB排除在连接之外。

15分钟对于基本HTTP来说是一个非常长的安静时期 - 可能更适合Websocket。除了协议更改之外,您应该能够调整负载平衡器上的超时期(由于您没有指定LB是什么),以更好地适合您的用例所有负载平衡器将允许超时高达15分钟。如果您不能更改协议无法将超时升高到足够高的位置,则必须经常从服务器发送keepalive消息(仅在超时时间内,所以也许是55s使用您当前的配置,或者比您可以在LB上设置的最高超时期。这必须是客户知道要丢弃的东西,例如{"type": "keepalive"}-在客户端很容易识别为"假"消息,以供守护目的。

最新更新