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

时间:2018-08-01 01:59:02

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

有人能在应用程序负载均衡器后面优雅地终止与Elastic Beanstalk的WebSocket连接吗?

在扩展期间,EC2实例被终止并立即断开其连接。我想知道是否有一种好的方法来处理终止,或者我只能终止一个不再具有任何活动连接的实例。

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

1 个答案:

答案 0 :(得分:1)

  

EC2实例终止,并立即断开其连接。   我想知道是否有一个很好的方法来处理终止,

您可以为用户提供更舒适的体验:

简单方法:

有一个名为“连接排水”的功能,当实例由于扩展事件而需要关闭时,它将等待预定义的时间以完成现有连接,而不会向该实例发送新的请求在指定的持续时间后,它将强制终止其余的连接(如果有)。因此,可以将时间设置为比您指定的Sticky会话cookie持续时间更长,也可以比从应用程序中设置的WebSocket TTL更长,并确保在此持续时间之后应用程序重试连接。

使用Elastic Beanstalk时。该功能位于ELB->应用程序->环境->配置-> LoadBalancers

enter image description here

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

更多动态(复杂)方法:

  

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

当由于伸缩事件通知客户端和服务器即将终止连接时,可能会发生“优美的”终止,以便它们然后可以在终止连接(即关闭实例)之前执行清理工作

是否要尝试使用该方法取决于您的用例。但是,如果需要,可以执行以下操作

  1. 建立WebSocket连接时。客户端应用程序提供了基础EC2实例ID。 (与websocket连接相对应)

  2. 为云监视事件“ Pending:Wait”创建云监视警报,事件详细信息为here

  3. 为云监视警报通知创建SNS主题。该通知应具有ec2实例ID。

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

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