因此,我们有一个通过 websocket 与客户端通信的服务器应用程序,我们需要定期升级我们的服务器应用程序二进制文件。我们可能有多个服务器实例,我知道我可以离线升级的实例,但您知道,由于 websocket 是长寿命的 tcp 连接,因此该实例仍与客户端保持一些现有连接,我们不希望这些现有连接断开。
我知道我可以在我们的服务器应用程序实现中做一些工作来将现有连接委托给子进程。但我现在想知道是否可以使用 AWS ELB 来缓解此问题。
我不太清楚 ALB/NLB 的具体工作原理,但我认为,由于 ALB/NLB 隐藏了客户端的服务器,因此 ALB/NLB 会保留与客户端的连接。那么在服务器升级期间,ALB/NLB 能否将与升级实例相关的现有连接迁移到已完成升级的实例?
假设我们有两个服务器实例 A 和 B,则该过程如下:
- 从 ALB/NLB 起飞
- 来自客户端的新连接将仅转发到 B
- ALB/NLB 将 A 的现有连接迁移到 B
- A 升级完毕,将 A 放到 ALB/NLB 上
- 来自客户端的新连接再次转发到 A
- 在 B 上重复此过程
整个过程中,客户端并不知道云端发生的一切。
ALB/NLB 是否支持类似这样的内容?
答案1
不幸的是,AWS 提供的 LB 均不具备将实时连接从上游迁移到另一个上游的能力。您需要花费较长时间进行排空并缓慢滚动连接。