Entity Framework 带弹性池。如何管理我的 SaaS 客户端数据库?

Entity Framework with elastic pool. How to manage my SaaS client database?

我目前正在寻找在 ASP.Net 托管在 Azure 云上的 SaaS。 我正在寻找有关如何最好地构建我的数据库以及随之而来的 Entity Framework 的建议。客户在 Web 应用程序上注册后,该应用程序需要在我的 Azure SQL 服务器上为每个客户创建一个单独的数据库。

我已经开始研究 elastic pooling 的选项,但它让我很困惑。告诉你一些关于我的数据库的信息,它有一个用于所有常规设置的 "meta" 数据库。然后每个客户都有一个包含他的投资组合的数据库。

例子

database [Settings] with tables (Currency, Stocks, Bonds) [

[Customer1] SomeFinanceProduct [Currency as foreign, stock as foreign], SomeOtherFinanceProduct [Currency as foreign, bond as foreign]

[Customer2] SomeFinanceProduct [Currency as foreign, stock as foreign], SomeOtherFinanceProduct [Currency as foreign, bond as foreign]

[Customer3] etc.

非常感谢更有经验的开发人员提供一些帮助。非常感谢,这对我来说是一个重要的问题。我还找到了 post 从 2015 年开始他们说解决方案将很快发布,但我在网上没有找到任何东西。

您想要一个每个租户都有一个分片的弹性池。

This link 描述了在多租户场景下可用于管理和查询分片数据库的工具。点击第一段中的链接,了解每个链接的详细信息。

我不能过多地谈论你问题的 Entity Framework 部分,但是,我可以谈论事情的弹性池方面。

请务必注意,Azure 弹性池只是一种计费和资源分配结构。就您的应用程序或其代码而言,如果您使用弹性池没有区别。您仍然有一个数据库,它存在于服务器上,而该服务器(间接地,但更具体地说是在对于 Azure,该数据库)具有资源限制。

在 Azure 中,您通常会创建数据库并选择服务或定价层。您支付 X 美元以换取该数据库的 Y 资源(CPU、内存、存储大小、连接数等)。您对创建的每个数据库重复此操作。随着时间的推移,数据库的大小或使用量会增加,而且它们的要求也会越来越高,因此您必须在这种情况下单独更改每个数据库的服务层。随着您拥有越来越多的数据库,这将变得乏味且成本​​低下。

使用弹性池,您可以使用任意数量的单独数据库并放弃单独的 service/pricing 计划,而是购买一大桶资源 [即弹性池]并将这些资源提供给所有数据库。从理论上讲,采用这种方法总体而言您需要的资源更少,这可以让您省钱。它还可以更好地利用您购买的资源。

您需要较少资源的原因是通常 数据库在不同时间经历高峰需求。当您单独购买资源时,您必须在每个数据库上过度购买以应对高峰(这意味着您有很多浪费的资源只是坐在那里未使用)。在弹性池中,由于所有数据库都在池中,您只需购买足够的额外资源,这些资源将涵盖您通常同时并发进行的许多高峰;现在您闲置浪费金钱的资源更少了。

正如我提到的,使用弹性池的另一个好处是您可以更好地利用您拥有的资源。考虑一个对它的要求很低的数据库;您自然会为它购买一个小的(因此便宜)计划。然后考虑一个对它有很高要求的数据库;您可能会购买具有更多资源的计划。现在,偶尔低使用率的数据库会受到一些大的打击。使用小计划,资源不够,性能会严重下降。与此同时,另一个数据库拥有大量资源,其中大部分未被使用。如果正在经历异常高峰的小型数据库可以借用其中一些资源几分钟,那不是很好吗?这正是弹性池的作用!弹性池为您的应用程序带来了许多内置的可扩展性优势!

最后要注意的是,弹性池每单位资源的成本高于常规数据库。这意味着存在一个收支平衡点,并且在您拥有足够的数据库以使其物有所值之前,使用弹性池的成本更高。根据我的需要,我发现 10-15 个数据库是一个相当不错的收支平衡点。一旦你有足够的,创建池。然后,当您稍后向池中添加更多数据库时,"per database" 成本开始下降得更多。

--

回到您的问题,弹性池不会特别影响您在项目中使用 Entity Framework 的能力。无论您是否选择合并数据库,您都必须让您的代码根据登录用户与适当的客户特定数据库对话。