代码部署问题,如果实现平滑重启

kaxikaxi · · 1250 次点击
这个不是go语言的问题,是所有二进制执行文件发布的应用程序都会遇到的问题。所有二进制可执行文件形式发布的应用程序,不杀进程重启的话是没办法更新到最新的版本的。 不杀进程重启的话,覆盖执行文件是能覆盖的,但是覆盖了也没用,因为内存中进程运行的还是旧的执行文件。 平滑重启的目的是为了尽量少或者不影响用户的访问,让服务器没有拒绝响应期,这个本质上要靠架构设计来解决。 如果是单进程的服务结构, 从设计上将单个进程拆分掉,比如拆分成 master 和 worker 进程,master 负责管理和维护 worker,并且向 worker 投递用户请求。当需要重启时,master 启动更新后的执行文件作为新的 worker1 进程,在启动期间的用户请求仍然投递给老的 worker 进程。 worker1 进程启动完成可以执行用户业务逻辑之后向 master 报告,这时 master 讲用户请求投递切换给 worker1 进程,然后关闭老的 worker 进程。 如果本来就是多进程或者多台服务器的集群方案,由 master 进程来管理多个业务逻辑进程,或者用户网关+消息队列来实现多个业务逻辑服务器之间的动态分配。当需要更新时,轮流对业务逻辑进程或者业务逻辑服务器进行更新并重启,这样从用户侧是感受不到的。中间存在灰度期,一部分用户的业务在旧的业务逻辑中运行,一部分用户在新的业务逻辑中进行,这要求业务逻辑的设计必须兼容性好,能够同时兼容这两种情况。 不管怎么样的架构设计,体系中总是有一些部分是不会被重启,始终运行的
#4
更多评论
前后兼容的发布 建议灰度 前后不兼容的发布 建议停机维护 go似乎没有不停机更新的说法
#1
https://studygolang.com/articles/2076 像这个是解决这样的问题吗,可是有个问题不停机没法实现覆盖啊
#2