nodeJS 应用程序中的两阶段提交

two phase commit in nodeJS application

我目前正在开发一个 nodeJS 应用程序,该应用程序很快将需要在两个 PostgreSQL 数据库上同时写入。这是为了冗余目的:写入操作必须同时在两个数据库上进行,或者如果其中一个数据库出现任何问题则回滚。

为了实现这一点,我需要依赖一个事务管理器,它将(或至少可以)在持久化过程中使用两阶段提交

目前,该应用程序使用开箱即用的解决方案对当前数据库执行操作(即 pg-promise 包,目前作为应用程序的事务管理器)。

简而言之,我将需要同时在两个数据库上执行 Node 应用程序中的每个持久化操作。

现在,我只使用 pg-promise 将数据持久保存在一个数据库中,就像这个例子一样:

db.one(mySQLRequest)

但我发现一次只能为一个特定的数据库创建一个 db 对象。

我没有在 NodeJS RESTful 应用程序上找到如此大问题的示例,但我怀疑这可能是一个相当普遍的问题。如果不需要我自己重新编写整个事务管理器,我会很高兴...

如果您对我如何允许我的 NodeJS 应用程序执行两阶段提交有任何线索,我们将不胜感激。 :)

nodeJS application that will soon need to write simultaneously on several PostgreSQL databases

pg-promise each Database 对象中包含一个单独的连接池,具有唯一连接。

因此,当与多个数据库通信时,您只需为每个创建一个 Database 对象,在这种情况下,使用 Database Context 参数也是一个好主意,它可以是任何东西.

例子

const pgp = require('pg-promise')(/* initialization options */);

const db1 = pgp(connection1, dbContext1);
const db2 = pgp(connection2, dbContext2);
const db3 = pgp(connection3, dbContext3);

I have to implement a two-phase commit in the persisting process

这必须是一个自定义实现,它取决于您的应用程序的业务逻辑。图书馆帮不了你,因为没有数据库间事务,你必须自己实现。

I even thought of rewriting some parts of the pg-promise module myself

我看不出它能给你什么。事务可以自动化的部分都已经有了,数据库间完整性的部分都在你这边

我搜索过,但没有找到任何 node.js 分布式事务管理模块。

如果您正在处理 roll-your-own,请查看 XA 事务,这是一种分布式数据库事务标准。 Java 通过 JTA(Java 事务 API)提供了强大而成熟的支持,这对节点开发人员仅作为灵感和参考有帮助。

postgresql 具有 two phase commit support,因此构建块用于 XA 支持或 hand-rolled postgresql-specific 实现。

我自己正在开发一个 XA-ish 事务管理器,但是工作和孩子的进展会很慢;辅助项目排在最后。一两年后寻找ivolucien/coaction...