我想我不完全了解部署过程。我知道的是:
- 当我们需要进行热部署时——这意味着我们需要更改实时的代码——我们可以通过重新加载模块来完成,但是
imp.reload
是个坏主意,我们应该重新启动应用程序,而不是重新加载已更改的模块- 理想情况下,正在运行的代码应该是代码存储库的克隆,在需要部署的任何时候,您只需提取更改即可
现在,假设我有多个wsgi
app实例在反向代理(如nginx
)后面运行(在8011、8012等端口上)。并且,让我们假设我每秒收到5
个请求。在
现在在这种情况下,我应该如何更新应用程序所有运行实例中的代码。在
- 如果我停止所有实例,然后更新所有实例,然后重新启动它们——我肯定会丢失一些请求
- 如果我逐个更新每个实例——那么实例将处于不一致的状态(一些实例将运行旧代码,另一些实例将运行新代码),直到所有实例都被更新。现在,如果一个请求命中一个更新的实例,然后一个后续的(和相关的)请求命中一个旧的实例(尚未更新)——那么我将得到错误的结果。在
有人能彻底解释一下像这样繁忙的应用程序是如何被热部署的吗?在
Tags:
对于跨负载平衡器(如nginx)后面的多个热实例的部署,我喜欢使用Fabric这样的工具进行滚动部署。在
这样你就永远不会离线,而且它是无缝的,因为nginx知道当一个web服务器被关闭时,它尝试循环到它,并将转移到下一个,一旦节点/实例备份,它将恢复到生产使用。在
编辑:
您可以使用nginx中的ip_hash模块来确保来自一个IP地址的所有请求在整个会话期间发送到同一个服务器
这对您意味着,一旦您的web服务器被更新并且客户端连接到新实例,该会话的所有连接都将继续转发到同一个服务器。在
这会让你陷入
这个场景回避了一个问题,你是否从你的API/站点中删除了一些可能会让客户机处于不确定状态的东西?如果您所做的只是更新UI元素或添加页面等,而不是更改任何后端api,那么您应该不会有任何问题。如果要删除API函数,则可能会出现问题。在
你不能让一半的服务器离线(比如把它们从负载平衡池中拉出来),然后更新它们吗。然后让他们回到网上,同时拉下另一半。然后更新这些并重新联机。在
这将确保您保持在线,同时也确保您的应用程序的旧版本和新版本不会同时在线。是的,这意味着你的网站将在这段时间内以其一半的容量运行。但那可能没问题吧?在
相关问题 更多 >
编程相关推荐