【问题标题】:How to handle updates of a web application in with multi tenant databases? [closed]如何使用多租户数据库处理 Web 应用程序的更新? [关闭]
【发布时间】:2018-01-31 20:12:15
【问题描述】:

我即将开发一个新的 SaaS 解决方案,我想在其中使用单个 Web 应用程序 (SPA),以及共享相同架构的多租户数据库。但是,我对更新和部署例程感到担忧。

假设我对 Web 应用程序和数据库进行了更改,我在其中向某个表添加了一个新列。现在我想更新 Web 应用程序,同时我想用新列更新所有数据库,而无需应用程序停机进行维护。我可以从更新单个租户数据库开始,但是一旦对租户进行更改,该租户的 Web 应用程序就不再是最新的。其他方式我可以先更新 Web 应用程序,但随后应用程序不再适用于任何租户。

我该如何解决这个问题?

【问题讨论】:

  • 您的网络应用不应该知道数据库的结构。它应该知道服务器 API。您可以对其进行版本控制,以允许不同版本的网络应用共存。
  • 您始终可以为每个租户配置一个新的 Web 应用实例。然后每个客户的环境都是真正隔离的,您可以依次更新每个客户。如果您对每个数据库都有单独的数据库,那么您实际上已经走上了这条路线。或者您可以按照建议对您的 API 进行版本控制,并为每个客户设置一个标志,说明他们使用的 API 版本,并让 Web 应用程序采用该值并相应地调整它调用的 URL。您必须确保您的 API 更改确实是向后兼容的。如果您想进行重大更改,您可能需要停机。
  • @HansKilian 你能重复一下吗?你将如何实现它?
  • 有不同的方法可以做到这一点。这是一个很好的起点:github.com/Microsoft/aspnet-api-versioning

标签: c# azure multi-tenant


【解决方案1】:

这是一个系统架构问题,答案很大程度上取决于您的要求和约束。

至于客户端,我同意@HansKilian,它不应该与数据库模式耦合。

至于服务器更新,您可能希望在 Docker 中运行您的应用程序。因此,每个 Docker 容器的 [instances of] 都专用于特定的租户,因此,它适用于特定的数据库。也就是说,没有两个租户共享同一个容器。由于许多不同的原因,这是有益的。例如:

  • 信息安全:SaaS 关注的问题之一是一个租户的数据意外泄露给另一个租户。如果你从不在同一个容器中运行两个租户,你就会减少发生这种事情的机会。

  • 细粒度部署:当您更新特定租户的数据库时,您只删除与该特定租户相关的容器。其余租户继续运行。

为了实现这样的架构,您需要将传入请求路由到正确的容器。这可以通过许多不同的方式来实现。例如,您可以将 NGINX 放在您的 Web 应用程序前面,让每个请求都包含一个标识租户的标头,并基于此定义路由规则。或者您可以在 swarm 模式下使用 Docker,并在容器服务名称中包含租户 ID。

这只是一个可以做的例子,不确定它是否适合您的场景——这完全取决于。

【讨论】:

    猜你喜欢
    • 2014-01-26
    • 2015-03-04
    • 2011-04-07
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    相关资源
    最近更新 更多