我们开发了一个多租户 ASP.NET 应用程序。当客户注册时,他们会获得自己的子域名用于他们的网站(例如 tenant1.ourapp.com)。
设置客户站点的过程需要免配置。
目前我们的设置如下:
- 1 个网站专用 IP 地址
- 将 *.ourapp.com 的 DNS A 记录设置为专用 IP
- IIS(7.5)中的单个网站处理对专用 IP 的所有请求
其余部分由我们的应用程序处理(检查 url 和加载租户特定的配置等)。
最大的问题是,如何扩展?假设我只想在 IIS 中为每个物理网站托管 50 个租户实例。现在我遇到的问题是,原始网站正在处理 ourapp.com 的所有请求(这要归功于通配符 DNS 记录)。
我们也正在研究 Azure,因此适用于独立服务器和 Azure 的解决方案将是黄金!
答案1
我会稍微改变你的架构:
Windows Azure 内置有负载均衡器。将所有网站安装到可以分布在多个实例上的单个 Webrole 上。配置多租户应用程序以根据源/客户/url 在内部路由请求。
如果您是真正的多租户,那么您将拥有一个代码库。用户看到的内容取决于他们的上下文/用户 ID/等等。这样,您就拥有一个应用程序,每个人都以循环方式共享您的实例的资源,并且没有一台服务器可以承受故障。
将 50 个站点放在一台服务器上,将另外 50 个站点放在另一台服务器上,等等。这是处理事情的“老式”非云方式。您的服务器出故障,50 个客户会宕机。当其中一个客户变得“太忙”而无法使用单台服务器时,您无法获得灵活性/可扩展性。
答案2
一般来说,如果我理解你的问题正确的话,你会想要研究一下负载均衡器将负载分散到多个 Web 服务器上。您可以将所有请求发送到负载平衡器,然后它会将请求转发到您的 Web 服务器。
您可以通过多种方式来实现这一点,您可以始终将 tenant1.ourapp.com 发送到同一台服务器,或者您可以将其分散到所有服务器或一组服务器中。
我个人喜欢在 Linux 上使用 HAProxy 作为负载均衡器,还有其他软件负载均衡器和硬件选项。