Golang 程序实现热更新

2022/03/31

Golang 程序实现热更新

热更新的定义就是在客户无感知的情况下进行程序的升级。

常用的方案有两种:

  • 程序上面有代理层,例如:NGINX、k8s-proxy
  • 程序自身实现热更新,例如:tableflip、endless

对于第一种方案来说,会消耗更多的资源,但是实现起来很简单,也不容易出错,从工程的角度来说是好的方案。

对于第二种方案来说,架构设计上更简单(毕竟少了一层转发代理),但是实现起来需要考虑的点很多,容易出现预期外的问题,工程上不建议使用,但在实现的过程中可以深入的理解:一个程序到底是如何运行的。

endless 已经很久没有更新了,除了简单的 Web 应用外,其他应用不建议继续使用,可以选择更新且更新频率更高的 tableflip。

对于第二个方案,简单的理解就是:程序先运行起来,在热更新的时候,自启动(fork)一个新的进程,同时将一些关键资源进行拷贝,在确保新的进程可以开始工作后原先的进程就退出。

可以参考 graceful-upgrades-in-go 里提到的设计。

重点:

  • 利用 SO_REUSEPORT 实现套接字复用

参考

Search

    Table of Contents