使用AWS ELB在服务器重新启动期间保持WebSocket连接?

3ks5zfa0  于 2023-04-12  发布在  其他
关注(0)|答案(1)|浏览(204)

所以我们有一个服务器应用程序,它通过WebSocket与客户端通信,我们需要定期升级我们的服务器应用程序二进制文件。我们可能有多个服务器示例,我知道我可以离线我正在升级的示例,但你知道,因为websocket是长期的tcp连接,所以示例仍然保持着与客户端的一些现有连接,我们不希望这些现有连接断开。
我知道我可以在我们的服务器应用程序实现中做一些工作来将现有的连接委托给子进程。但是我现在想知道我是否可以使用AWS ELB来缓解这个问题。
我不太清楚ALB/NLB是如何工作的,但我想既然ALB/NLB对客户端隐藏了服务器,那么ALB/NLB就拥有了与客户端的连接。那么在服务器升级时,ALB/NLB是否可以将与升级示例相关的现有连接迁移到已经完成升级的连接上?
假设我们有两个服务器示例A和B,过程如下所示:
1.从ALB/NLB起飞A
1.来自客户端的新连接将仅转发到B

  1. ALB/NLB将与A的现有连接迁移到B
  2. A升级完成,将A放到ALB/NLB上
    1.来自客户端的新连接再次转发到A
    1.在B上重复该过程
    在整个过程中,客户端不知道云上发生了什么。
    ALB/NLB支持这样的东西吗?
eulz3vhy

eulz3vhy1#

不,这是不可能的。原因不在于ELB,而在于TCP本身。TCP是一个有状态的协议,WebSocket协议也在它之上。ELB所做的是将每个数据包转发到TargetGroup。如果它必须做你想要它做的事情,它必须了解更高级别的协议。
另一个镜头:当ELB的目标切换时,ELB将需要握手新的会话。客户端具有以下状态:会话已经示例化,但是对于服务器来说连接是新的。所以应该在ELB端握手新会话。我希望你能看到这是怎么回事。
如果您需要滚动更新而不中断客户端会话,我认为您可以尝试使用连接引流(现在称为注销延迟),超时时间长于您的会话。
另一种选择是API Gateway,它以您希望ELB工作的方式工作。它拥有WebSocket连接,并且只有在发送消息时才会联系Lambda。服务器也可以通过联系专门的URL并以这种方式发送数据来发送消息。

相关问题