4

我开始在 ASP.NET MVC2 中构建 SaaS 业务线应用程序,但在开始之前,我想建立良好的架构基础。

我将采用共享数据库和共享模式方法,因为数据架构和业务逻辑将非常简单,效率和成本效益是关键问题。

为了确保租户之间数据的良好隔离,我想实现租户视图过滤器安全模式(看看这里)。为此,我的应用程序必须根据登录应用程序的用户来模拟不同的租户(数据库登录)。登录过程需要尽可能简单(它不会是企业级软件)——所以客户应该只输入他们的用户名和密码。

用户将通过他们自己的子域(使用子域路由)访问他们的数据,例如http://tenant1.myapp.comhttp://tenant2.myapp.com

满足这种情况的最佳方法是什么?

4

2 回答 2

6

我还建议使用两个数据库,一个 ConfigDB 和一个 ContentDB。

ConfigDB 包含租户表以及该表中每个租户的 Content 数据库的主机名、数据库名、sql 用户名和 sql 密码,并通过名为 usrAdmin 的单独 sql 用户访问

ContentDB 包含所有应用程序表,按用户的 SID(或 SUSER_ID)分段,并由每个租户 sql 用户访问,称为 usrTenantA、usrTenantB、usrTenantC 等。

要检索数据,您以管理员身份连接到 ConfigDB,检索相应客户端的凭据,使用检索到的凭据连接到服务器,然后查询数据库。

我这样做的原因是为了横向可扩展性和按需隔离客户端的能力。

您现在可以拥有许多 ContentDB,也许每十个注册的租户创建一个新数据库,并配置您的应用程序以开始在该数据库中配置客户端。

或者,您可以配置几个 sql 服务器,在每个服务器上创建一个内容数据库,并让您的代码配置租户在历史上使用率最低的服务器上。

您也可以在服务器 A 和 B 上托管所有常规客户端,但服务器 C 可以在其自己的 INDIVIDUAL 数据库中拥有租户,所有多租户代码仍然存在,但可以告诉这些客户端,由于更高的隔离性,它们现在更安全.

于 2010-11-18T03:18:18.797 回答
0

最简单的方法是创建一个 Tenants 表,其中包含一个 URL 字段,您可以匹配所有通过的查询。

如果一个租户可以有多个 URL,那么只需有一个像 TenantAlias 这样的附加表,它维护每个租户的多个 URL。

缓存这个表web端,因为它会被打很多;每当值更改时使缓存无效。

你可以看看 DotNetNuke。它是一个开源 CMS,它实现了这个精确的模型。我在我们的几个应用程序中使用该模型,效果很好。

顺便说一句,对于系统中的每个实体,您都需要为上表获取一个tenantid 列。

于 2010-09-17T19:47:45.273 回答