静态语言热更新 - 网络篇
本篇只讨论网络解决方案,该方案适用于任何语言
这里热更新的定义
- 用户不能断开业务连接
- 用户业务数据不能中断,不能有消息丢失
- 服务器存储数据不能中断或丢失,尤其是内存中的数据
- 服务器逻辑需要重新加载
方案表现形式
- 一个进程承载用户连接,以下称网关
- 一个进程承接业务逻辑,以下称后端
- 本地内存 [这里不做讨论]
- 共享内存 [这里不做讨论]
- 第三方内存数据
网关和后端
网关负责网络的稳定连接,无重大更新不停止或重启网关。
网关负责和后端的消息传递,网络热更新模式的关键就在于双方传输通道的稳定、拉起以及消息的存储、完整。因此这里要将消息和传输通道作抽象和分离。要保证后端接收的消息能够处理, 网关发送的消息不丢失,尤其在后端准备重新拉起的过程中。这里有一个步骤:
- 后端告知网关将要重启
- 网关暂停向后端传递消息,网关需要能保存用户继续发送过来的请求
- 网关告知后端可以重启了
- 后端接收完并处理完所有的消息,然后重启
- 后端重启成功
- 网关重新连接到后端
- 通道连接成功后,恢复消息传递,包括积压的消息
关键一:处理积压消息
- 积压消息设定阈值,保证内存的平稳
关键二:设定超时阈值
- 不管何种原因,传输通道中断后,需要做超时检测
关键三:后端的重启加速
- 获取重启指令后, 立即拉起一个新进程,尽快初始化
- 新的进程开启监听
- 原有进程处理完收尾逻辑,关闭原有进程