【问题标题】:Terminating WebSocket connections on AWS EBS behind ALB在 ALB 后面的 AWS EBS 上终止 WebSocket 连接
【发布时间】:2019-01-08 11:59:16
【问题描述】:

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

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

通过粘性会话/cookie 的魔力,每个 WebSocket 客户端都是有状态的。将客户端重新连接到其他问题很好,但我想尽可能避免这样做。

【问题讨论】:

    标签: amazon-web-services amazon-ec2 websocket amazon-elastic-beanstalk autoscaling


    【解决方案1】:

    EC2 实例被终止并立即断开它们的连接。 我想知道是否有处理终止的好方法,

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

    简单的方法:

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

    当您使用 Elastic Beanstalk 时。该功能位于 ELB -> Application -> Environment -> Configuration -> LoadBalancers

    它应该满足你当前的需求。

    更动态(复杂)的方法:

    “终止那些打开的连接的优雅方式。”

    当客户端和服务器都被通知由于缩减事件而即将终止连接时,可能会发生“优雅”终止,以便它们可以在连接终止之前执行房屋清洁任务,即实例被关闭.

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

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

    2. 为云手表事件“Pending:Wait”创建云手表闹钟,事件详情为here

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

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

    如您所见,还有更多活动部分。但是,如果它改善了用户体验和用例证明它是合理的。那么这将是一个解决方案。

    【讨论】:

    • @Caffeineli 如果满足您的需要,您能接受答案吗?
    • 感谢您的回答。我已经查看了连接耗尽,正如您所提到的,它等待连接完成。这很好,因为不会将新连接添加到此实例中。主要问题是 WebSockets 保持打开状态,所以即使我正在等待使用连接耗尽,也没有优雅的方式来终止这些打开的连接。
    • 添加了动态方法,这将使客户端和服务器都能够在实例终止之前进行清理。
    • 感谢您添加该信息,这是通知客户端实例即将终止的好方法。我已将您的答案标记为例外答案。也许我们会在未来看到更多引入 ELB 的功能来帮助解决这个问题。
    猜你喜欢
    • 2022-01-20
    • 1970-01-01
    • 2019-02-28
    • 2022-11-18
    • 2019-12-11
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    相关资源
    最近更新 更多