我们在经典负载均衡器后面的AWS Elastic Beanstalk中运行的Node.js服务中使用Server-Sent Events(SSE)。在负载均衡器中,我们已启用连接耗尽,超时时间为15分钟,因此当实例停止运行时,长时间运行的正在进行的请求有机会完成。但是,由于任何SSE连接也将被视为正在进行的请求,并且由于SSE的性质而无法自动完成,这意味着实例将始终需要整整15分钟才能停止服务。 / p>
为了解决这个问题,到目前为止我们已经考虑了以下几个选项:
由于我们发现上述解决方案缺乏,我们正在寻找一种方法立即关闭所有SSE连接,只要从负载均衡器中删除实例,这样我们就不必每次发生这种情况都要等15分钟。
例如,如果实例在服务中断时可以订阅它,那将是理想的。不幸的是,到目前为止我们还没有找到这样的东西。
编辑:挑战在于确定负载均衡器何时将实例停止服务,以便我们可以关闭该实例的SSE连接。
编辑2:我们通过查看传入的请求解决了这个问题。一旦服务在一定时间内(例如60秒)检测到没有传入请求,它就知道它很可能被取消服务,因此它关闭所有SSE连接。最糟糕的情况是它实际上仍在使用中,但由于断开连接的SSE客户端会自动重新连接,这并不重要。