当我使用PHP开发和更新生产服务器上的文件时,我只需动态复制文件,一切似乎都能正常工作而不会中断服务器。
但是如果我要更新Go服务器和应用程序上的代码并且需要终止服务器,将src文件复制到服务器,运行go install,然后启动服务器,这将中断服务,并且如果我经常这样做,那么对我的服务用户来说看起来会非常糟糕。
使用Go with Go的http服务器时,如何在没有停机的情况下更新文件?
答案 0 :(得分:2)
PHP是interpreted language,这意味着您以源格式提供代码,PHP解释器将读取并执行它(它可能会创建一个更紧凑的二进制形式,因此它不必分析在需要时再次来源。)
Go是compiled language,它编译成本机可执行二进制文件;更进一步它是静态链接,这意味着在创建可执行文件时,您的应用所引用的每个代码和库都会被编译和链接。这意味着您不能将新的模块“插入”正在运行的应用程序中。
您必须停止正在运行的应用程序并启动新版本。但是,您可以最大限度地减少停机时间:仅在已创建新版本的可执行文件并准备运行时停止正在运行的应用程序。您可以选择在远程计算机上编译它并将二进制文件上传到服务器,或上传源并在服务器上编译它,这没关系。
通过这种方式,您可以将停机时间减少到最多几秒,这是您的用户不会注意到的。此外,您不应该每小时更新一次,在一小时的编码中您无法真正实现重大更新。您可以每天(甚至更不频繁)安排更新,并且可以在流量较低时安排数小时。
如果您无法接受几秒钟的停机时间,那么您应该自动寻找可以自动处理此问题的平台,而无需停机。例如,请查看Google App Engine - Go。
答案 1 :(得分:1)
首先,不要按此顺序进行。首先复制并安装。然后你可以停止旧进程并运行新进程。
如果你运行应用程序的多个实例,那么你可以进行滚动更新,这样当你弹出一台服务器时,其他服务器仍在服务。类似的方法是执行blue-green deployments,其优点是活动集群运行的代码始终是同类的(而在滚动部署期间,您将有一个混合,直到它们全部滚动),您也可以进行蓝绿色部署,通常只有一个应用程序实例(而滚动需要多个实例)。但是,它确实要求您在蓝绿色开关期间将实例加倍。
您要考虑的一件事是任何正在进行的请求 - 您可能希望确保正在进行的请求继续发送到旧代码服务器,直到完成为止。
您还可以查看平台即服务解决方案,它可以为您自动化大量此类内容,还有更多内容。这样您就不会进入生产服务器并手动复制文件。在考虑操作时,12 Factor App原则始终是一个好的开始。
答案 2 :(得分:1)
恩典库可让您在不烦扰用户的情况下进行优雅重启:https://github.com/facebookgo/grace
但根据我的经验,重新启动Go应用程序非常快,除非您拥有高流量网站,否则不会造成任何麻烦。