2009-02-03 30 views
0

我们正在构建一个将作为SaaS提供的Silverlight应用程序。最终产品是连接到WCF服务的Silverlight客户端。由于客户端的数量可能很大,因此更新需要很简单,最好能够一次更新所有实例。SQL/WCF/Silverlight的多租户

由于没有实现多租户之前,我正在寻找关于如何实现

  • 轻松升级
  • 数据安全
  • 可扩展性

三种不同的模式要考虑的是意见上市msdn

  1. 单独的数据库。这并不容易维护,因为所有模式更改都必须单独应用于每个客户的数据库。还有其他缺点吗?专家是数据分离和安全。这也允许对每个客户稍作修改(这可能比它的价值更麻烦)。
  2. 共享数据库,独立模式。 TenantID列被添加到每个表中。确保每个客户获得正确的数据是潜在的危险。易于维护和扩展(?)。
  3. 共享数据库,独立模式。与第一个模型类似,但每个客户在数据库中都有自己的一组表。很难为单个客户恢复备份。可维护性与模型1(?)类似。

对这个问题的文章的任何建议?有没有人探讨过与Silverlight SaaS应用类似的东西?客户端需要考虑什么?

+0

您还需要真正考虑定制。这可能比你想象的要大得多。第一种方法更容易。您可以使用其他选项与复杂的元数据存储一起使用,但这是需要思考的问题。 – BobbyShaftoe 2009-02-18 05:45:24

回答

1

取决于应用程序的类型和数据的规模。每个人都有失败。 1)独立的数据库+ WCF /客户端的单一实例。保持一切同步将是一个挑战。如何在同一时间升级X个数据库服务器,如果一个失败并且现在不同步并且与客户端/ WCF层不兼容,该怎么办?对于每个客户,“筒仓”,单独的DB/WCF /客户端。您没有同步问题,但是您有管理每个图层的许多不同实例的开销。此外,你将不得不看看SQL授权,我不记得是否单独授权单独的SQL实例($$$)。即使您可以根据需要安装尽可能多的实例,多个实例的开销在特定点之后也不会变得微不足道。

3)基本上与1a/b相同的问题,除了许可。

2)最佳升级/管理场景。保持数据隔离是一个非常重要的问题(1a技术上在更高层面上分享此问题)是正确的。另一个问题是,如果您的应用程序数据密集,则不得不担心数据可伸缩性。例如,如果每个客户预计有数十/数百万行数据。然后,由于总的客户群体积,您将开始遇到问题并查询单个客户的性能。客户对自己的数据量造成的减速更为宽容。被告知其缓慢,因为其他99个客户数据很大,通常是不行的。

除非您知道一个事实,您将从一开始就处理大量的数据量,现在我可能会用#2来开始,并且在未来需要时开始查看群集或转向1a/b设置。

1

我们也有一个SaaS产品,我们使用的解决方案#2(共享DB /共享模式与TenandId)。有些事情要考虑为所有共享DB /相同的模式:

  1. 如上文提及,高音量一个租户,如果你不小心可能会影响其他住户的性能数据;对于初学者,请适当/谨慎地为您的表建立索引,并永远不要执行强制执行表扫描的查询。监视查询性能,至少计划/设计能够根据一些对您的域有意义的标准对数据库进行分区。

  2. 数据分离是非常非常重要的,你不希望最终呈现出的数据块的一些租户属于其他租户。每个查询都必须有一个WHERE TenandId = ...在其中,并且您应该能够在开发过程中验证/执行此操作。

  3. 模式的可扩展性是解决方案1和3可能给您的,但您可以通过设计一种方法来扩展与您的域中的文档/表相关的字段,使其有意义(即。作为msdn文章提到的表的元数据)

0

现有答案是好的。您应该深入了解升级和管理多个数据库的问题。不知道具体的应用程序,它可能变得更容易拥有多个数据库,并且不必支付追踪TenantID的额外费用。这可能不会是最终的正确决策,但您应该对数据共享的开发成本保持警惕。

1

那么,那些提供开箱即用的建筑像Apprenda的SaaSGrid解决方案?它们让您可以在部署和维护时进行数据库决策,而不是在设计时进行。看起来他们积极改造和管理数据层,并提供升级引擎。

1

我有类似的情况,但我的解决方案是兼具优势。

如果数据和数据如何放置是从租户的问题。当然,我不希望我的数据被共享,我希望我的数据是孤立的,安全的,我可以在任何时候想要。

某些数据可能是分享例如:公司名单。因此,数据库应该是全局和租户数据库,只需确保锁定在租户数据库架构中,并立即更新所有租户数据库。

反正SaaS模式交付的一切作为服务器/网络服务,所以无论身在何处的数据库应该来为客户服务,则只能通过客户端GUI渲染。

谢谢