【问题标题】:Is it possible to deploy without downtime without disconnecting TCP sockets connected?是否可以在不断开连接的 TCP 套接字的情况下进行部署而不停机?
【发布时间】:2020-04-03 16:35:08
【问题描述】:

有一个长连接的 TCP 套接字。最多两个客户端可以连接到服务器。换句话说,负载并不高。但是,一旦建立 TCP 连接,除非发生意外,例如服务器掉电或网络故障,否则套接字不会断开连接。重新启动进程时是否可以重用现有的 TCP 套接字?我认为不能使用像 AWS NLB 这样的 TCP 负载均衡器,因为现有的套接字不会移动到新的应用程序中。我希望在没有停机的情况下进行部署,因为我正在使用的系统是一个在套接字损坏和数据丢失时可能遭受财务损失的系统。低级套接字编程是可以的。

我已经阅读了 CloudFlare 的 https://blog.cloudflare.com/graceful-upgrades-in-go/ 文章,解释了 Nginx 的优雅重载机制。由于 HTTP 服务器是一个经常打开和关闭套接字的服务器,所以那篇文章假设服务器的连接有一天会关闭,但我的情况略有不同。所以我不确定这是否可以使用。

【问题讨论】:

  • 你可能无法替换这个被设计协议破坏的东西?
  • 哈哈..当它们断开连接时,它们会再次相互连接。恐怕只有在TCP连接丢失时才会丢失。当然最好改成request-response后终止的协议。

标签: sockets


【解决方案1】:

一个套接字可以在多个进程之间共享,例如通过在同一个父进程中打开套接字并派生一个子进程。但是,如果使用套接字的最后一个进程关闭,则套接字会隐式关闭。

这意味着您必须确保始终有一个打开的进程使用套接字。例如,如果新软件的部署不首先退出旧进程然后创建新进程,但如果新进程将启动并且旧进程会将套接字转移到新进程,则可以这样做,请参阅Can I share a file descriptor to another process on linux or are they local to the process? 了解如何在 Linux 中做到这一点。其他方法是在执行fork() 时使用文件描述符继承。

请注意,这些文件描述符的共享仅适用于状态完全保存在操作系统内核中的普通套接字。使用 TLS 套接字会更难或不可能,因为在这种情况下,当前的用户空间状态也需要以某种方式共享。

另一种方法是拥有一些中间“代理”,它一方面具有与脆弱应用程序的稳定套接字连接,另一方面是对要更新的应用程序的强大套接字处理(即在需要时重新连接)。然后此代理在双方之间传输流量,并在出现问题时根据需要重新连接套接字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-27
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 2020-02-07
    • 2020-07-04
    相关资源
    最近更新 更多