在部署插槽交换后,如何正常迁移打开的Websocket连接?

时间:2018-03-16 12:21:00

标签: asp.net-core websocket azure-web-sites azure-deployment-slots

在我的网络应用程序中,当用户登录到应用程序时,他们的浏览器会打开一个Websocket到服务器,以便可以将更新推送到浏览器。

它是在Azure App Services中运行的ASP.NET核心Web应用程序(自托管)。我希望使用Azure的deployment slot swapping功能将代码更新推送到生产环节,无需停机部署。

在我完成的有限测试中,看起来在插槽之后,Websocket连接保持打开,浏览器连接到原来的插槽。 (因此,如果浏览器的Websocket连接到插槽A,并且我们交换插槽A和B以便新连接进入插槽B,则Websocket仍将对插槽A上运行的应用程序开放。)

在某些时候,旧插槽将脱机,这将强行关闭所有打开的Websockets。我希望尽可能优雅地重新打开Websocket到新插槽,并在插槽交换后尽快重新打开,这样如果我更新与Websocket相关的代码,所有客户端将尽快运行新代码。

这可能有用的草图:

  1. 进行广告位交换
  2. 将通知发送到旧插槽上运行的代码
  3. 在旧插槽上运行的代码会推送Websocket消息以重新连接
  4. 收到消息后,浏览器会打开一个新的Websocket连接(将转到新的插槽)
  5. 当连接成功时,浏览器会关闭旧的Websocket
  6. 有更好的方法吗?

    旧插槽上运行的代码如何知道它何时被交换?

    是否可以优雅地处理这个问题?或者总会有一堆竞争条件?

1 个答案:

答案 0 :(得分:3)

WebSockets确实保持连接,因为ARR只能将新请求引导到" new"应用。例如,如果您在交换过程中下载大文件,则会看到相同的行为。

我处理此问题的方法是让我的部署系统(八达通)进行交换,然后向旧的"做出请求。应用程序,通知所有连接的WebSocket客户端,他们需要断开连接并重新连接。客户端将立即断开连接,选择随机延迟(以防止数千次重新连接),然后在延迟后重新连接。