我这边的情况是,在windows下交叉编译编译好Linux下对应的可执行文件后上传至Linux执行开启服务。
如果版本迭代后,再执行上面的流程将新的可执行文件上传至Linux覆盖重启。这里有一个问题如果原来的文件是在工作状态则不能覆盖成功,需要将之前的服务停掉,才能进行覆盖操作。
我想请教一下,最佳的golang代码部署方案。
这个不是go语言的问题,是所有二进制执行文件发布的应用程序都会遇到的问题。所有二进制可执行文件形式发布的应用程序,不杀进程重启的话是没办法更新到最新的版本的。
不杀进程重启的话,覆盖执行文件是能覆盖的,但是覆盖了也没用,因为内存中进程运行的还是旧的执行文件。
平滑重启的目的是为了尽量少或者不影响用户的访问,让服务器没有拒绝响应期,这个本质上要靠架构设计来解决。
如果是单进程的服务结构, 从设计上将单个进程拆分掉,比如拆分成 master 和 worker 进程,master 负责管理和维护 worker,并且向 worker 投递用户请求。当需要重启时,master 启动更新后的执行文件作为新的 worker1 进程,在启动期间的用户请求仍然投递给老的 worker 进程。 worker1 进程启动完成可以执行用户业务逻辑之后向 master 报告,这时 master 讲用户请求投递切换给 worker1 进程,然后关闭老的 worker 进程。
如果本来就是多进程或者多台服务器的集群方案,由 master 进程来管理多个业务逻辑进程,或者用户网关+消息队列来实现多个业务逻辑服务器之间的动态分配。当需要更新时,轮流对业务逻辑进程或者业务逻辑服务器进行更新并重启,这样从用户侧是感受不到的。中间存在灰度期,一部分用户的业务在旧的业务逻辑中运行,一部分用户在新的业务逻辑中进行,这要求业务逻辑的设计必须兼容性好,能够同时兼容这两种情况。
不管怎么样的架构设计,体系中总是有一些部分是不会被重启,始终运行的
#4
更多评论