我们正在构建一个将作为SaaS提供的Silverlight应用程序。最终产品是连接到WCF服务的Silverlight客户端。由于客户端数量可能很大,因此更新需要很容易,最好能够一次性更新所有实例。
之前没有实施多租户,我正在寻找有关如何实现的意见
有关该主题的文章的任何建议?有没有人用Silverlight SaaS应用程序探索类似的东西?我需要在客户端考虑什么?
答案 0 :(得分:1)
取决于应用程序的类型和数据规模。每个人都有垮台。
1a)单独的数据库+ WCF /客户端的单个实例。保持一切同步将是一个挑战。如何同时升级X数量的数据库服务器,如果一个服务器出现故障并且现在不同步且与客户端/ WCF层不兼容怎么办?
1b)“Silos”,为每个客户分别设置DB / WCF / Client。您没有同步问题,但您确实需要管理每个层的许多不同实例。此外,您还必须查看SQL许可,我不记得是否单独许可SQL的单独实例($$$)。即使您可以根据需要安装任意数量的实例,多个实例的开销在某一点之后也不会是微不足道的。
3)除了许可之外,基本上与1a / b相同。
2)最佳升级/管理方案。你是对的,保持数据隔离是一个巨大的问题(1a技术上在更高层次上分享这个问题)。另一个问题是如果您的应用程序是数据密集型的,您必须担心数据可伸缩性。例如,如果预计每个客户都有数十/数亿行数据。然后,由于总客户群数量的原因,您将开始遇到问题并查询各个客户的绩效。客户对他们自己的数据量造成的减速更加宽容。由于其他99个客户数据很大,被告知它很慢,通常是禁止的。
除非你知道一个事实,你将从一开始就处理大量数据,我现在可能会使用#2,并且如果将来需要的话,开始考虑集群或转向1a / b设置。
答案 1 :(得分:1)
我们还有一个SaaS产品,我们使用解决方案#2(与TenandId共享数据库/共享架构)。共享数据库/所有人的相同模式需要考虑的一些事项:
如上所述,如果您不小心,一个租户的大量数据可能会影响其他租户的表现;对于初学者来说,正确/仔细地索引你的表,永远不会做强制表扫描的查询。监控查询性能,至少计划/设计能够根据对您的域有意义的一些标准对您的数据库进行分区。
数据分离非常重要,您不希望最终向属于其他租户的某个租户显示一段数据。每个查询都必须包含WHERE TenandId = ...并且您应该能够在开发期间验证/强制执行此操作。
模式的可扩展性是解决方案1和3可能提供给您的,但您可以通过设计一种方法来扩展与您的域中的文档/表相关联的字段(有意义)( ie。表格的元数据,如msdn文章所述)
答案 2 :(得分:1)
提供像Apprenda的SaaSGrid这样开箱即用的架构的解决方案怎么样?它们允许您在部署和维护时制定数据库决策,而不是在设计时。他们似乎积极转型和管理数据层,并提供升级引擎。
答案 3 :(得分:1)
我也有类似的情况,但我的解决方案同时具有优势。
数据和数据的放置方式是租户提出的问题。作为租户当然我不希望我的数据被共享,我希望我的数据是孤立的,安全的,我可以随时随地获取。
它可能共享的某些数据,例如:公司列表。因此数据库应该是全局和租户数据库,只需确保锁定操作租户数据库模式,并立即更新所有租户数据库的程序。
无论如何SaaS模型都是作为服务器/ Web服务提供的,所以无论数据库应该作为服务来到客户端,只能通过客户端GUI进行渲染。
由于
答案 4 :(得分:0)
现有答案很好。您应该深入研究升级和管理多个数据库的问题。在不知道特定应用程序的情况下,拥有多个数据库可能会变得更加容易,而无需支付跟踪TenantID的额外成本。这可能不会成为正确的决定,但您当然应该对数据共享的开销成本保持警惕。