Loopbackjs 环回4中基于模式的多租户 用例

Loopbackjs 环回4中基于模式的多租户 用例,loopbackjs,loopback4,Loopbackjs,Loopback4,在基于模式的多租户应用程序中,通常有一个数据库具有多个模式。一个模式是存储公共应用程序数据的主模式,一个模式用于应用程序的每个租户。每次向系统注册新客户时,都会在数据库中自动创建一个新的隔离模式。这意味着,模式是在运行时创建的,事先不知道。客户的架构是根据客户的域命名的。当请求进入系统时,将验证用户,并使用主模式上的数据选择模式。然后,大多数/所有后续数据库操作都转到特定于租户的模式。正如您所看到的,我们要使用的模式仅在运行时已知 问题 如何在运行时选择模式?我们正在使用postgres连接器。

在基于模式的多租户应用程序中,通常有一个数据库具有多个模式。一个模式是存储公共应用程序数据的主模式,一个模式用于应用程序的每个租户。每次向系统注册新客户时,都会在数据库中自动创建一个新的隔离模式。这意味着,模式是在运行时创建的,事先不知道。客户的架构是根据客户的域命名的。当请求进入系统时,将验证用户,并使用主模式上的数据选择模式。然后,大多数/所有后续数据库操作都转到特定于租户的模式。正如您所看到的,我们要使用的模式仅在运行时已知

问题 如何在运行时选择模式?我们正在使用postgres连接器。我们应该能够在运行时切换模式

另一个问题是如何为不同的租户运行迁移

笔记:
db模式需要以请求范围的方式设置,以避免为其他可能属于其他客户的请求设置模式。为整个连接设置架构不是一个选项。

您可以在运行时创建需要两个参数的DefaultCrudepository(使用旧式juggler模型和数据源的CRUD存储库的默认实现)

  • 数据源
  • 模型
  • 现在,使用所需的设置实例化数据源,包括您想要使用的模式 然后向DefaultCrudepository实例提供模型和数据源,如下所示:-

    const ds=new PostgresDataSource({
    连接器:“postgresql”,
    主持人:“某个主持人”,
    端口:'某个端口',
    用户:“某个用户”,
    密码:“password”,
    数据库:'数据库',
    架构:“特定租户的架构”,
    });
    
    const repo=新的defaultcrudepository(SomeModel,ds)环回团队的您好问得好!我也有这个问题!如果有一种方法可以动态切换到模式,那就太好了@EdwinIkechukwuOkonkwo公认的答案很有效。你可以试试。感谢请注意,示例应用程序将为每个传入请求创建一个新的数据源实例。这将反过来创建到PostgreSQL数据库的新连接池。因此,数据库连接不会跨请求重用。这可能会成为一个性能问题。@MiroslavBajtoš你说的是并行请求吗?请求是否并行并不重要。UserService定义为瞬态,LB为每个传入请求创建一个新实例。将
    console.log
    (或
    console.trace
    )交给构造函数自己查看。@MiroslavBajtoš我已经对您告诉的问题做了一些更改,并检查了数据库连接。现在对我来说工作正常。请复习一下。1.我知道datasource设置是单例的,因此为此,我们可以将此数据源与其他数据源分开使用,这样应用程序就不会因其他数据源而崩溃。2.我知道您正在为此构建功能,但我们迫切需要使用loopback 2.0.0。代码@MiroslavBajtoš的链接请您查看Hitesh的新修改。他的代码工作正常吗(没有为每个传入的请求创建一个新的db实例)?如果我们也在运行时得到模型(对于特定的模式),会怎么样,那么,我们是否能够在同一个模式中获得相同的repo运行时?恐怕我不明白在运行时获得模型是什么意思?@MiroslavBajtoš在这个问题上有任何进展吗?我浏览了的PR,但没有看到最终结果。您是否做出了在LB上启用多租户的最终决定?@mbnoimi恐怕多租户不是我们的优先事项。我认为Raymond的示例应该为构建自己的多租户应用程序提供一个良好的起点。“好吧,我们没有更新或更好的东西了。”米罗斯拉夫巴伊托听到这些很难过。不幸的是,LB中有很多东西我都在挣扎!您是否有任何路线图或里程碑要遵循(在Github中已经过时),只是为了了解发生了什么。