在 ALB 后面的 AWS EBS 上终止 WebSocket 连接

Terminating WebSocket connections on AWS EBS behind ALB

有没有人有办法在 Application Load Balancer 后面优雅地终止与 Elastic Beanstalk 的 WebSocket 连接?

在缩减过程中,EC2 实例被终止并立即断开连接。我想知道是否有处理终止的好方法,或者我是否只能终止一个不再有任何活动连接的实例。

每个 WebSocket 客户端都是有状态的,通过粘性 sessions/cookies 的魔力。将客户端重新连接到不同的问题是可以的,但我想尽可能避免这样做。

EC2 instances are terminated and immediately drop their connections. I'm wondering if there's a good way to handle the termination,

您可以为您的用户提供更优雅的体验:

简单方法:

有一个功能叫做'Connection Draining',当一个实例由于缩容事件需要关闭时,它会等待现有连接完成的预定义时间,它不会发送新的请求到该实例并在指定的持续时间后,它将强制终止剩余的连接(如果有)。因此,时间可以设置得比您指定的粘性会话 cookie 持续时间长,也比您从应用程序设置的 WebSocket 的 TTL 长,并确保应用程序在此持续时间后重试连接。

因为您正在使用 Elastic Beanstalk。该功能位于 ELB -> Application -> Environment -> Configuration -> LoadBalancers

应该可以满足您当前的需求。

更动态(复杂)的方法:

"graceful way to terminate those open connections."

"graceful" 当客户端和服务器都被通知由于缩减事件而即将终止连接时,可能会发生终止,以便它们可以在连接终止之前执行清理任务,即正在关闭实例。

如果你想冒险进入那条路线,这取决于你的用例。但是,如果您需要,您可以执行以下操作

  1. 当WebSocket连接建立时。客户端应用程序提供了底层 EC2 实例 ID。 (对应websocket连接)

  2. 为云监控事件"Pending:Wait"创建云监控报警,事件详情为here

  3. 为云手表警报通知创建一个 SNS 主题。通知应包含 ec2 实例 ID。

  4. 客户端应用程序和服务器应用程序都订阅了该主题。当通知到达时,他们可以检查 ec2 实例 ID 以验证它是否是 WebSocket 连接的主机。如果是,他们准备在发生缩减事件时终止连接。

正如你所看到的,有更多的活动部分。但是,如果它改善了用户体验和用例证明它是合理的。那就解决了。