我正在设计一个基于Web的多租户SaaS应用程序,该应用程序将托管在Windows Azure上并使用表存储。
到目前为止我发现的唯一限制是:
我决定如何为多个客户分配我的存储空间:
选项1:为每个客户提供自己的存储帐户。考虑到5帐户默认限制,不太可能。
选项2:为每位客户提供他们自己的一组表格。使用客户标识符作为表名的前缀,例如将Books表拆分为“CustA_Books”,“CustB_Books”等。
选项3:拥有一组表,但在分区键前加上分隔客户。所以一个“书籍”表的分区键为“CustA_Fiction”,“CustA_NonFiction”,“CustB_Fiction”,“CustB_NonFiction”等。
选项2和3有哪些优缺点?单个帐户中可能影响选项2的表数量是否有限制?
答案 0 :(得分:10)
您可以在Windows Azure中创建的表数量没有限制。你唯一的限制是你已经列出的那些。嗯...如果你认为实体属性的大小总是64KB或更少,或者你考虑批量选项(100个实体或4MB,无论什么是较小的),我猜还有其他限制。
无论如何,要记住的是你的PartitionKey将是你做的最重要的事情。如果您创建一个包含客户名称的PK,您将获得一些良好的分区优势。这样做的缺点是,如果您将客户数据混合在同一个表中,您就会更难以删除数据(如果您需要删除客户)。因此,您可以将该表用作另一级别的分区。您创建的PK的范围限定为您在其下创建的表。
我在这里考虑的是,您是否需要批量删除数据,或者是否需要跨客户(租户)查询数据。对于第一个,每个客户使用单独的表是很有意义的,因此删除是一个操作,而最多每100个实体1个。但是,如果您需要跨租户查询,当您有多个表(这将需要多个查询)时,更难加入此数据。
在所有条件相同的情况下,如果租户功能没有重叠,我会将这些表用作另一级别的分区,如果我想删除租户,可以让我的生活更轻松。所以,我猜这是选项2。
HTH
答案 1 :(得分:2)
我强烈建议选项2
我们也采用这种方式,因为它为客户数据添加了一个很好的级别或联合。正如已回答的评论所述,管理添加/删除客户更容易。我们注意到的另一个好处是“复制”和“复制”。客户数据这种方法可以更轻松地将客户特定数据移动到其他存储帐户或开发环境进行测试,而不会影响整个批次。
在SaaS领域,它还使客户能够轻松获取自己数据的副本,这也是许多SaaS用户关注的问题。
答案 2 :(得分:1)
另一种选择: 想象一下,你有N个存储帐户,每个订阅的限制是100个存储帐户。每个存储帐户都有一个每个客户的表。
对于使用分区键的表请求操作,如插入,更新,删除或点查询,您可以计算客户名称+分区键的哈希值,计算其基本N的模块(存储帐户总数),找到确切的存储帐户的索引,并将请求转发到正确的存储帐户/表。
对于没有分区键的读取请求,例如范围查询。然后,您需要将请求广播到所有存储帐户并合并结果。
要特别注意命名多个存储帐户,还要记住其中一件事。避免按字典顺序命名帐户,这将导致它们从Azure后端的同一分区服务器提供,并与其建议的可扩展性最佳实践相对应。如果您有N个存储帐户。使用3位哈希为每个存储帐户名称添加前缀,这样它们就可以均匀分布。