Golang Go语言中2019年末服务端进程自动更新重启的最佳姿势是什么?

Golang Go语言中2019年末服务端进程自动更新重启的最佳姿势是什么?
场景是上万台虚机上面的 agent, 需要实现自动更新, 然后重启生效.


看了一下社区的方案大概有如下这些:

jpillora/overseer

cloudflare/tableflip

Teamwork/reload

cespare/reflex

oxequa/realize

inconshreveable/go-update

rcrowley/goagain

不知道大家有没有这方面的经验? 谢谢


更多关于Golang Go语言中2019年末服务端进程自动更新重启的最佳姿势是什么?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

19 回复

fresh?

更多关于Golang Go语言中2019年末服务端进程自动更新重启的最佳姿势是什么?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


systemd?
比自己实现稳多了

systemd 不是解决方案,systemd 就是 kill restart,关键还是要在自己程序中捕获信号并支持软重启、热重启。

master 进程管理 主进程负责整体的调度和任务分配 启动子进程处理 需要更新的部分放到子进程上
具体可以根据自己的业务调整

如果只是任务上报 允许丢失或者短暂不可用的 那么 restart 也没啥问题

之前是 grace github.com/facebookarchive/grace
现在大部分都换到了 tableflip

…… 容器滚动

supervisor

systemd 可以捕获到杀进程信号,没捕获到可能是没配置好,我也觉得 systemd 比较妥。

呃呃看错了,打扰了

用的是容器。

看原理,结合业务特性自己实现。

这不是 k8s 典型的应用场景么?

发个消息让它自杀,然后让 systemd 之类的重启。热更新就算了吧。

cloudflare 的那个库不支持 windows




弱弱问下,软重启是指?
Master 进程这个应该是较好的方案,但是这种应该也会做不到业务不感知吧

作为 master 进程是知道目前有没子进程的可用,在没有可用的时候,就不把任务投递出去,设计上 master 进程可以使用 channel 来做一个小型队列。当监听到重启信号时,等待子进程执行完毕,然后推出,杀掉,重启,回到空闲进程池,业务上完全无感知,只是中间的这几个请求响应的时间会变高(具体取决于重启时间)。

了解一下 nginx reload 原理

针对2019年末Golang服务端进程自动更新重启的最佳姿势,以下是一些专业的建议:

  1. 优雅重启:采用优雅重启机制,即在重启过程中不中断正在处理的请求。这通常通过发送信号给服务进程来实现,如SIGHUP,使旧进程处理完当前请求后再退出,同时新进程接管新的请求。
  2. 信号捕捉与处理:在Go程序中设置信号捕捉机制,以便在接收到重启信号时能够执行必要的清理工作,如关闭数据库连接、释放资源等。
  3. 自动化部署工具:使用自动化部署工具(如CI/CD系统)来管理更新和重启过程,确保更新的一致性和可靠性。这些工具可以自动构建、测试和部署新的代码,同时监控服务的状态。
  4. 监控与告警:实施全面的监控和告警策略,以便在重启过程中或重启后及时发现并解决问题。这包括监控服务的可用性、性能以及日志分析。
  5. 文档与测试:确保更新和重启过程有详细的文档记录,并进行充分的测试,包括单元测试、集成测试以及压力测试,以确保新版本的稳定性和可靠性。

综上所述,采用优雅重启机制、信号捕捉与处理、自动化部署工具、监控与告警以及文档与测试是2019年末Golang服务端进程自动更新重启的最佳姿势。这些措施可以确保在更新和重启过程中服务的可用性和稳定性。

回到顶部