1

因此,我们正在构建一个多租户系统以作为服务运行。我们从头开始。我们正在关注 DDD;该域(目前)有大约 20 个实体,以后还会有更多。它由我们托管,地理上冗余(除了 SQL 查询之外的所有内容都有 n+1 ;-) ),并且设计灵活(嗯,最后是我们自己的要求,而不是业务',尽管他们希望我们能够当然可以根据需要轻松更改它)。我们基于 .NET,并将使用关系数据库作为我们的后备存储。我们并不反对(完全)使用开源工具和库。

业务的必备功能之一是系统的租户可以扩展某些实体。例如,客户端 A 可能希望实体 Foo 具有 Title 和 Abstract 属性,而客户端 B 可能希望实体 Foo 具有 Publish Date 和 Directed-By 属性——而不是 Title Abstract。

也可能是它应该为需要的租户支持多种语言的数据 - 例如,一个租户可能有兴趣将其整个帐户翻译成两种(或更多)语言;“静态”字符串和作为数据附加到实体的字符串。

所以。任意数量的字段(在一些通用基线之上;所有租户都将获得关于这些实体的某些内容),可由客户端定义(他们也可以在其中定义数据类型)。数据翻译的可能性(不复制实体 - 例如,没有用英语设置一组,然后用法语设置相同的一组)。强类型、可搜索、可查询的后备存储也是如此(因此,XML 字段中没有额外的东西,除非有办法让它成为强类型和可搜索的)。高性能(但作为次要要求;该功能非常重要,可以在必要时购买硬件)。

数据量?在我们当前的系统中,一个“普通”客户端有数百个实体,一个“大”客户端有数千个实体。请求通常会过滤这些列表以显示在 10-200 之间,最常见的事情可能涉及六个实体(在新系统中应该是可扩展的)。

其他点?每个实体都有指向拥有它的租户的直接链接。

在 .NET 领域如何处理这个问题?有人建议我们将实体放入一个 IoC 容器中,并在运行时动态地将它们 glob 在一起——但是如何将其映射到关系数据库呢?

我还记得很久以前读过Ayende关于 Lucene.NET 的帖子,这听起来不错,但目前我们还没有任何使用 Lucene.NET 或 nHibernate 的经验。(我们目前将 Linq2Sql 用于我们的 ORM,但如果我们需要更改它以支持这一点,坦率地说,我个人会很高兴)。

我读了这个从 Ayende 链接的 Castle dev list thread,看起来 nHibernate 有一个叫做 IUserType 的东西可能会有所帮助——我想知道我们是否可以应用它,为每个租户拉出适当的 IoC?因此,每个可扩展实体的每个租户都有一个 IUserType,并将数据本身存储在 SQL Server(我们最可能的 RDBMS)内部的 XML 列中。

最后,我刚刚阅读了一个关于动态更改每个租户每个实体的 DB 表的建议 - 但这听起来很不错......老实说,令人担忧!我的意思是,它可以工作,但将这种能力授予租户(他们可能不太懂技术)听起来并不是一个好主意。我想它可能仅限于管理员员工......

4

2 回答 2

1

看看Ayende关于多租户的系列文章。他分析了几种解决可扩展性问题的方法。

于 2008-12-03T02:11:13.080 回答
0

There are a variety of ways to accomplish it, but the issues of multi-tenancy go deeper than just the data model. I hate to be plugging product, but check out SaaSGrid by my the company I work at, Apprenda.We're a cloud operating system that allows you to write single tenant SOA apps (feel free to use NHibernate for data access) that automatically injects multi-tenancy into your app. When you publish your app, you can do things like choose a data model (isolated database or shared) and SaaSGrid will deploy accordingly and your app will run without any code changes - just write code as if it were for a single tenant!

于 2008-12-04T21:48:26.243 回答