跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • go 热更新的简单可行的解决方案
未分類
15 1 月 2021

go 热更新的简单可行的解决方案

go 热更新的简单可行的解决方案

資深大佬 : awanganddong 3

现在项目队列消费者打算用 go 来重构。

现在问下 go 实现热更新的方式
初期暂时不考虑 k8s 那套,有什么其他比较好的办法吗

就是类似 nginx 热更新那样,起新的 work 进程来接替旧的 work 进程

大佬有話說 (18)

  • 資深大佬 : monsterxx03

    https://github.com/cloudflare/tableflip

  • 資深大佬 : lewis89

    热更新,运行中的线程 栈幁怎么处理?
    用新的二进制代码处理?新的二进制的代码能兼容老的栈幁结构?
    具体技术原理有什么介绍吗
    @monsterxx03

  • 資深大佬 : lewis89

    @monsterxx03 #1 看了..一下 nginx 用的是操作系统的提供进程信号 机制… 那这跟 k8s 流量切换本质上没什么区别..

  • 資深大佬 : Vegetable

    nginx 是无状态的,但是应用程序可能是有状态的,fork 新程接管流量之后退出的方案是有的,比如 https://github.com/fvbock/endless
    如果想实现程序不停机维护,最简单的方法其实是双实例+负载均衡。不在代码层面做这个事了。

  • 資深大佬 : fds

    进程中的数据应该没法保留。毕竟底层没有个 VM 在运行。只能是交给第三方或者做个集群什么的。

    如果 socket 也要传递给新进程,可以参考 https://mosn.io/docs/concept/smooth-upgrade/ 通过 UNIX Domain Socket 传 fd 。
    另外还有个管理器可以参考,会下载新包重启的 https://github.com/jpillora/overseer 。

  • 資深大佬 : rimutuyuan

    一个 http 框架中热更新代码逻辑,或许可以参考
    https://github.com/gogf/gf/blob/94adc50487951565990b04a053e23c256af93945/net/ghttp/ghttp_server_admin_process.go#L107

  • 資深大佬 : monsterxx03

    README 里有个连接讲原理. 其实就是 nginx 那套, spawn 一个新的子进程加载 elf binary, 复制 fd, 接管新流量, 老的进程会等待一个 graceful timeout 的时间把已接收的请求处理完, 你是消息队列消费者的话就要确保 task 能在这个时间内被处理完否则会被强制 kill. 和 k8s 还是有区别的, k8s 是在 kube-proxy 那层完成的流量切换, 没这么 tricky, 功能更强(可以实现红绿部署).

    你说兼容栈帧那套单进程内热更新我很确定 go 是没有的,这个需要语言 runtime 支持, 印象里只有 erlang 支持, 而且限制性很大, 好处也就是能保留内存缓存.

  • 資深大佬 : keepeye

    印象中 go 好像没办法实现守护进程的

  • 資深大佬 : monsterxx03

    以为是主, 忘了 @lewis89

  • 資深大佬 : siteshen

    以前尝试过用代码完成热更新( API server ),但因为用 docker 运行会遇到了解决不了的问题而放弃。

  • 資深大佬 : thet

    前面加个 nginx

  • 資深大佬 : Lonenso

    https://grisha.org/blog/2014/06/03/graceful-restart-in-golang 你可以看看这个

  • 資深大佬 : buffzty

    为什么非要热更新 不中断服务无缝更新不行吗? nginx -> 2 个 upstream 先更新 1 更新完再更新 2 不是美滋滋?

  • 資深大佬 : treblex

    endless 挺好的,需要写个脚本找一下旧的进程,然后 kill -SIGHUP endless 会根据 kill 信号 fork 进程
    现在都只用 air 了,发现文件变动自动重启,比热更新方便些

  • 資深大佬 : vus520

    主是想实现长连接业务做无感升级?

  • 資深大佬 : frozenshadow

    mosn 里面有个通过 Unix socket,传递 accept fd 的骚操作

  • 資深大佬 : 2379920898

    bee 了解一下

  • 主 資深大佬 : awanganddong

    @buffzty 这个方案应该更适合我们的业务
    @vus520 应该是我理解有偏差了,直接用 nginx 切业务就可以了。

    谢谢大家了

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具