【问题标题】:Approach of setting up multi-tenant environment with ASP .NET Core使用 ASP .NET Core 搭建多租户环境的方法
【发布时间】:2020-12-05 01:48:43
【问题描述】:

我一直在为设置多租户环境的方式而苦苦挣扎。在之前的项目中,我将其设置为一个整体,其中有一个租户实体将所有正确的数据相互绑定。这种方式很容易设置,但所有租户的数据都在一个大数据库中。

我现在的想法是以不同的方式进行设置。我将使用 Postgres,因为也可能有“模式”。我的想法是在公共架构中拥有整体数据,在租户自己的架构中拥有特定于租户的数据。

我面临着一些我无法理解的挣扎。在下图中,您可以看到这两种情况的简图。底部的包含公共架构中的所有内容,而上面的则具有公共架构中的域和用户。

我的想法是,当客户访问特定于租户的 URL 时,应用程序不必爬取所有可能的模式。对用户来说同样重要。当用户想要登录应用程序时,我们也不想爬过所有模式。但是我该如何以正确的方式进行设置呢?

此外,当用户管理他的域(添加/编辑/删除)时,他实际上是在公共架构上管理它们。还是我应该完全避免使用 public ?我想把它们放在这里,否则当用户进入一个新域时,我还必须在其他租户架构上检查它们。

我也可以简单地设置域中租户的架构名称还是应该是连接字符串?

我还在这里和那里阅读了有关多租户的信息,但我不确定应用程序如何使用不同的架构(公共)从租户架构中获取正确的数据来获取租户的数据。 我应该使用控制反转来根据对域(公共架构)或客户(特定于租户)的调用来获得特定的实现吗?

https://nebulab.it/blog/how-to-switch-solidus-ecommerce-to-multi-tenant/

https://michael-mckenna.com/multi-tenant-asp-dot-net-core-application-tenant-resolution

Which Multi-tenant approach is recommended

【问题讨论】:

  • 不同的应用在不同的时间决定租户。有时它基于 Web 请求中的信息,或者它是在应用程序的特定实例上配置的,或者租户范围内的实体通过显式列关联

标签: c# postgresql asp.net-core multi-tenant


【解决方案1】:

我个人使用第一个数据库执行您的第一个方法 + 多数据库之类的操作,该数据库告诉我每个租户的位置。我称之为路由数据库。 该 dB 有 2 个表。

  • 数据库(如果,连接字符串)
  • 租户(租户信息,如果数据库)

这样我就拥有跨多个数据库的数据,并且每个数据库仍然有多个租户。

此外,数据库 id => 连接字符串通常使用 redis 进行缓存,因此无需使用 cachemanagercore 库在每个请求(您甚至可以在内存中使用)都达到 dB。

如果租户需要自己的不共享数据库也很容易处理。 通常在中间件上获取一个带有 dB id 的 cookie,然后由注入的 DatabaseResolver 类加入,您需要使用 DbContext Getdatabse () 之类的方法访问 dB

【讨论】:

  • 嗨@dariogriffo,我理解正确,您添加了一个额外的数据库?公共模式应该保存在哪里?每个租户都位于由域确定的特定模式中。您将(所有)域存储在哪里?不在每个租户的单独数据库中,对吗?对用户来说同样重要吗?您会在应用程序启动时首先获取并存储所有用户、域和租户吗?例如将它们存储在redis中?非常感谢您指出我的某个方向,谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-01-17
  • 2018-11-13
  • 2018-07-04
  • 2012-01-23
  • 1970-01-01
  • 2014-05-31
  • 2022-01-13
  • 2011-04-23
相关资源
最近更新 更多