sockets - 是否可以在不断开连接的 TCP 套接字的情况下进行部署而不停机?
问题描述
有一个长连接的 TCP 套接字。最多两个客户端可以连接到服务器。换句话说,负载并不高。但是,一旦建立 TCP 连接,除非发生意外,例如服务器掉电或网络故障,否则套接字不会断开连接。重新启动进程时是否可以重用现有的 TCP 套接字?我认为不能使用像 AWS NLB 这样的 TCP 负载均衡器,因为现有的套接字不会移动到新的应用程序中。我希望在没有停机的情况下进行部署,因为我正在使用的系统是一个在套接字损坏和数据丢失时可能遭受财务损失的系统。低级套接字编程是可以的。
我已经阅读了 CloudFlare 的https://blog.cloudflare.com/graceful-upgrades-in-go/文章,解释了 Nginx 的优雅重载机制。由于 HTTP 服务器是一个经常打开和关闭套接字的服务器,所以那篇文章假设服务器的连接有一天会关闭,但我的情况略有不同。所以我不确定这是否可以使用。
解决方案
一个套接字可以在多个进程之间共享,例如通过在同一个父进程中打开套接字并派生一个子进程。但是,如果使用套接字的最后一个进程关闭了套接字,那么底层连接就会隐式关闭。
这意味着您必须确保始终有一个使用套接字的进程打开。例如,如果新软件的部署不首先退出旧进程然后创建新进程,但如果新进程将启动并且旧进程会将套接字传输到新进程,则可以这样做,请参阅我可以共享linux上另一个进程的文件描述符还是进程本地的?
了解如何在 Linux 中做到这一点。其他方法是在执行fork()
.
请注意,这些文件描述符的共享仅适用于状态完全保存在 OS 内核中的普通套接字。使用 TLS 套接字将更加困难或不可能,因为在这种情况下,当前用户空间状态也需要以某种方式共享。
另一种方法是拥有一些中间“代理”,它一方面与您的脆弱应用程序具有稳定的套接字连接,另一方面是对您要更新的应用程序的强大套接字处理(即在需要时重新连接)。然后,此代理在双方之间传输流量,并在出现问题时根据需要重新连接套接字。
推荐阅读
- javascript - 管理可导出 API 的最佳实践
- python - 在 DASK 上运行的 cuML 函数?和 dask_cudf 操纵?
- ruby - 部署到引擎场失败:'找不到密钥::密码'
- python - 是否可以加载经过训练的 Rasa NLU 模型并运行推理以获取嵌入
- ios - 将 ResearchKit 应用程序上传到 App Store 时出错 - 错误 ITMS-90035 签名无效
- java - 将填充有相似度分数的矩阵分组到桶中
- python-3.x - 获取函数的 co_names,而不是装饰器的 co_names
- jekyll - Jekyll 中的自定义排序集合
- c++ - 如何使用 QDatastream 通过 QTcpSocket 发送 QSqlQueryModel?
- java - 根据整数输入请求一定数量的输入