gpt4 book ai didi

go - 更新 Go Web 应用程序的最佳实践

转载 作者:IT王子 更新时间:2023-10-29 02:16:28 24 4
gpt4 key购买 nike

我想知道将更新部署到 (MVC) Go Web 应用程序的最佳实践是什么。想象一下以下场景:

1) 为我的 Go Web 应用程序编写代码并测试一些更改

2) 在没有任何当前使用以前版本的人被打断的情况下部署更新。

我不知道如何确保可以涵盖第 2) 点 - 当有人向服务器发送请求并且我正在重建/重新启动它时,他会收到错误 - 即使请求只是使用一部分代码我没有接触过或者是向后兼容的,或者如果我只是添加了一个新的请求处理程序。

也许我遗漏了一些琐碎的或众所周知的模式,因为我正在学习 go,我以前的 Web 应用程序是 ASP.NET 或 php 应用程序,这不是问题,因为我不需要在代码更改时重新启动网络服务器。

最佳答案

这不仅仅是 Go 的问题,但通常我们可以将问题分为两个独立的问题:

  1. 确保当前请求不会终止并影响用户体验。

  2. 确保不会出现无法处理新请求的停机时间。

第一个更容易解决:你只是不暴力杀死你的服务器,而是告诉它退出,导致一个“Drain phase”,在这个阶段它不接受新的请求,只完成当前正在运行的请求,并退出。例如,这可以通过监听信号并将应用程序进入特殊状态来完成。

对于 Go 来说这不是一件小事,因为默认的 http 服务器不支持关闭它,但是你可以用 net.Listener 启动一个服务器,然后保持对它的引用并关闭它时间到了。

现在,只执行第一个方法然后再次启动服务将导致在这种情况下新请求不被接受,我们都知道在极端情况下这可能需要几秒钟。

所以我们需要的是已经运行新代码的服务器的另一个实例,即旧代码不响应新请求的那一刻,对吧?这可以通过多种方式完成:

  1. 拥有多个服务器,并且在它们之上有一个负载均衡器,允许一个(或多个)服务器在我们重新启动另一台时承担负载。这是最简单的方法,也是大多数人这样做的方法。如果您需要 N 台服务器来承担用户的负载,只需保持 N+1 并一次重启一台即可。

  2. 使用套接字共享技巧。在较新的 Linux 内核中,许多进程可以在同一个端口上监听和接受。您所做的只是启动新实例,然后告诉旧实例完成并退出。这样就没有停顿。这是通过在监听套接字上设置 SO_REUSEPORT 来完成的。

  3. 以上内容可以通过准备交付的解决方案自动执行,例如 Einhorn,它可以为您处理所有细节,请参阅 https://github.com/stripe/einhorn

  4. 此博客文章中记录了另一种方法:http://blog.nella.org/?p=879

关于go - 更新 Go Web 应用程序的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27756705/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com