golang写的web application 怎么优雅的更新?

像php这种解释型语言开发的web application ,更新代码的时候都是直接push就可以了,不会中断服务,但是像golang这种编译型的语言更新完代码还要编译


我的问题是怎么在不中断服务的前提下更新golang web application?通常的做法有哪些?还请各位不吝赐教

已邀请:

raindylong - 学习go的路上,盼望登顶的一天

赞同来自: astaxie sujunxuan cholerae 小浩

一般的做法都是在webapp前加一层nginx之类的,由nginx的upsteam group搞定灰度更新的问题,例如可新、旧版本webapp同时工作一段时间,稳定后去掉旧版本只留新版本,如此类推。


以上。

sheepbao - 流媒体,分布式,即时通信

赞同来自: sujunxuan RedMothball

可以用golang自己实现,但是只在类unix系统中有用,利用系统信号量和启动子进程,将旧的socket描述符传递给新的socket描述符,github已经有不少这样的库,很多golang的http框架也实现了。这种实现叫“graceful restart”或者“zero downtime server”,实现不中断服务更新。
具体参考可以看看这些项目和几篇文章:


astaxie - 创造、获取、分享、传播和应用Go

赞同来自: 小浩

web application基本上都是短连接的应用,所以采用Nginx的upsteam是更好的方式

kevin - 杭州云柚科技

赞同来自:

利用graceful restart,更新二进制文件后发送指令重启服务器

songtianyi

赞同来自:

1楼正解,补充一下,灰度更新可以用openresty,国人的热门项目。

要回复问题请先登录注册