【问题标题】:How to safely update a live website如何安全地更新实时网站
【发布时间】:2010-10-12 10:00:48
【问题描述】:

我们有一个相当简单的基于 Django 的网站来进行 CRUD 操作。我一直在本地进行测试和开发,然后在测试完成后将版本和数据库架构更改检查到实时服务器上。我们最近在发布某些类型的更改时遇到了问题。想象以下事件序列:

  1. 用户打开一个网络表单
  2. 网站已更新,要求此表单上有新字段
  3. 用户提交他们一直在处理的表单
  4. 服务器返回错误,因为它希望接收在步骤 2 中添加的新字段

其他网站如何处理此类问题?我的想法:

  • 在进行更新时使网站脱机。这并不能真正解决问题,因为用户可以在提交之前无限打开 Web 表单,但在一定时间之后有时,任何人都不太可能提交表单。
  • 在非常低的流量时间进行自动更新。这并不能真正解决问题,但我们的网站不是那么受欢迎,如果我们在凌晨 3:00 进行更新,我怀疑会有很多用户。这种技术的一个问题是自动更新失败。
  • 版本控制表单,以便服务器识别正在提交的旧表单并提供对用户更友好的响应。是否有自动化工具可以帮助解决这个问题?

想法?

【问题讨论】:

  • 这个问题——用户在升级过程中提交表单——是否常见到让你难以接受?或者这是一个假设的“可能有一天会发生”的问题?
  • @S.Lott,如果我们不担心极端情况,我们就不会成为优秀的程序员。
  • 我认为真正的问题是“什么是升级实时网站的好方法?”
  • 如果用户提交了一个添加了必填字段的表单,您是否希望它给他们一个错误并要求填写新字段?否则它显然不是必需的
  • 丹尼尔是对的。您会收到一个表单验证错误,这既是好的也是预期的行为。 AFAICT 提出的用例不是问题。

标签: django deployment schema versioning


【解决方案1】:

“正确”的做法是使用定义明确的视图来优雅地处理整个故障类别。在向您的模型添加一个需要的新字段的情况下(我假设这是正在发生的事情),视图应该使用 ValidationError 异常来处理该异常,该异常会引发友好的错误消息并将用户发送回表单( ,重新加载时,应该有可用的新字段)。无论向模型中添加什么字段,异常都会抛出一个干净的错误并将用户返回。

【讨论】:

    【解决方案2】:

    我使用的很多网站(当然,主要是在我的工作单位内部)都宣布类似“我们将在本周末从周六下午 6:00 到周日早上 6:00 进行维护。请计划在那个时候离开系统。”虽然它并不完美,但没有什么是完美的,这似乎是一个好方法。只需腾出足够的时间来推出新的东西,对其进行测试,并在需要时回滚到旧的。如果您觉得有必要,您可以随时设置一个简单的页面,上面写着“抱歉,我们现在不可用”,并在停机期间将人们引导至该页面。一般来说,如果你不需要你最初声明的所有时间并且你早早回来,那么没有人会抱怨(也许那些想找借口不工作的懒鬼是个例外,但无论如何他们可能不工作)。

    【讨论】:

      【解决方案3】:

      更改已发布的 API(或 UI,在这种情况下)总是很棘手。如果可能,请保持向后兼容性。对于大多数形式,我认为功能不会在版本之间发生变化。您可以添加或删除一两个字段,但这将由后端的表单验证处理。这基本上就是您在第 4 步中所描述的内容。我真的不认为这是什么大问题。运行时错误时有发生 - 只要您的应用程序优雅地处理它并通知用户问题,那么真的没有问题。

      【讨论】:

        【解决方案4】:

        如果这确实是一个大问题,您可以将代码版本作为某种隐藏变量包含在每个表单中。如果提交的版本与当前运行的应用程序版本不匹配,您可以显示适当的错误,并让他们填写表单上可能存在的任何新字段。您甚至可以更进一步,只显示表单已更改的消息。可能根据表单的定义创建某种散列,并将其用作隐藏字段。如果哈希错误,您就知道他们提交的表单不正确。

        【讨论】:

          【解决方案5】:

          如果没有在验证中编码发生更新的可能性,我看不出如何实现这一点。例如。 “预期”该字段在提交时可能已更改,并相应地设置默认值/拒绝。

          随着维护窗口的临近,如何“缩减”提交内容,以最大限度地减少那些让浏览器保持打开状态的用户?

          【讨论】:

            猜你喜欢
            • 2017-02-02
            • 1970-01-01
            • 2019-01-13
            • 1970-01-01
            • 1970-01-01
            • 2020-01-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多