【问题标题】:Use Mongoose-Transactions over multiple databases在多个数据库上使用 Mongoose-Transactions
【发布时间】:2020-07-06 01:10:06
【问题描述】:

我正在创建一个包含多个微服务的 Node.js API。

每个微服务负责我的应用程序的一项或多项功能。但是,我的数据被结构化为多个数据库,每个数据库都有多个集合。

现在我需要一种服务来跨多个数据库执行原子操作。如果一切都发生在同一个数据库中,我会使用普通事务。但是,我不知道如何对多个数据库执行此操作,或者这是否可能?

示例

其中一个微服务负责创建用户。用户必须是 在两个数据库中创建。然而,这应该以原子方式发生, 即如果创建了用户,则必须在两个数据库中都创建它。

更新MongoDB's official docs 声明如下:

使用分布式事务,事务可以跨平台使用 多个操作、集合、数据库、文档和分片。

我还没有找到任何关于如何使用 mongoose 执行分布式事务的信息。

如果有人能就这个话题给我一些澄清,我会非常高兴。

【问题讨论】:

    标签: node.js mongodb mongoose transactions nosql


    【解决方案1】:

    需要使用微服务架构的SAGA pattern

    SAGA模式分为两种:

    1. 基于编排的传奇
    2. 基于编排的传奇

    如果您想从单个服务管理分布式事务,则可以使用基于 Orchestration 的 saga (2)。

    因此,使用这种模式,您可以使用补偿事务来实现分布式事务,该事务要么执行一系列动作,要么沿链回滚。

    我也推荐在这个site上学习微服务架构的模式,推荐book

    【讨论】:

    • 谢谢。你知道有没有办法用 mongoose 来实现这一点?
    • Mongoose.js 是一个工具,你的每个服务都用它与数据库通信,你需要在业务逻辑级别实现 SAGA 模式,这是一个更高级别的任务。换句话说,如果您使用基于编排的 saga,您将需要在其中一个服务中实现业务逻辑,这将启动对其他服务的一系列调用以保存数据,并在出现错误时实现补偿事务。跨度>
    • 我对node.js不熟悉,但是这个框架可能适合你-docs.nestjs.com/recipes/cqrs#sagas
    • 我明白你的意思,但根据 MongoDB 文档,可以在不同的数据库上运行事务,这意味着我不必实现 SAGA 模式。只有当 Mongoose 不支持分布式事务时,我才必须实现你的模式。
    • 另一个很好的例子 - medium.com/@ganeshmani009/…
    【解决方案2】:

    编辑:Mongoose 支持分布式事务,因为它是 MongoDB 服务器的客户端。 Form Mongoose point of view, a distributed transaction is just a transaction

    根据此视频,Distributed Transactions in MongoDB Distributed Transactions 定义在 mongoose 之上,可以使用。

    在 mongodb 的 documentation 中,他们说:

    分布式事务和多文档事务始于 MongoDB 4.2,这两个术语是同义词。分布式事务 参考分片集群和副本上的多文档事务 套。多文档交易(无论是在分片集群还是 副本集)也称为分布式事务,始于 MongoDB 4.2。

    这是我尝试解决这个问题的方法(分而治之):

    1. 试试Distributed Transactions with MongoDB的简单例子
    2. 然后尝试使用简单的mongoose with Transactions(据猫鼬所知,分布式事务和非分布式事务之间可能没有区别,因为事务处于更高级别 - 参见视频)。
    3. 然后尝试结合这两种解决方案,看看效果如何,
    4. 如果不适用于 mongoose,我会尝试使用 MongoDB 实现分布式事务,因为视频显示他们在这方面花费了 很多 的努力,而且由于 mongoose 只是让你做的事情您也可以单独使用 MongoDB。从 mongoose 迁移到 MongoDB 可能并不那么简单,但实现分布式事务非常困难。

    【讨论】:

    • 你是对的。根据我在 GitHub 上打开的问题,运行常规 mongoose 事务非常有效。
    猜你喜欢
    • 2015-09-27
    • 2020-09-25
    • 2019-11-29
    • 1970-01-01
    • 1970-01-01
    • 2019-05-23
    • 2021-04-22
    • 2017-12-25
    • 2017-08-12
    相关资源
    最近更新 更多