【问题标题】:two phase commit in nodeJS applicationnodeJS应用程序中的两阶段提交
【发布时间】:2018-11-01 10:53:24
【问题描述】:

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

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

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

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

目前,我只使用 pg-promise 将数据持久保存在一个数据库中,如本例所示:

db.one(mySQLRequest)

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

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

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

【问题讨论】:

  • “我必须在持久化过程中实现两阶段提交” 相反,外部事务管理器必须实现两阶段犯罪? (不确定 PostgreSQL 如何处理分布式事务。)无论如何,实现者不太可能是你。
  • two-phase commit 听起来像是一个嵌套事务,pg-promise 支持得很好。你应该包含一个你正在尝试做的代码示例,并解释什么是行不通的。
  • @vitaly-t:在多个 PostgreSQL 数据库上同时写入这句话让我觉得更像是分布式事务,而不是嵌套事务。但你是对的——需要更多代码,或者至少需要更多细节。
  • 我会尝试改进我的问题以使其更清晰。我想我的观点更多的是关于分布式事务,因为应用程序中的所有持久化操作必须同时在两个数据库上执行。
  • 感谢您的回答。我试图改进我的问题,如果我仍然不清楚,请告诉我。

标签: node.js postgresql transactions commit pg-promise


【解决方案1】:

很快需要同时在多个 PostgreSQL 数据库上写入的 nodeJS 应用程序

pg-promise 内,每个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);

我必须在持久化过程中实现两阶段提交

这必须是一个自定义实现,取决于您的应用程序的业务逻辑。该库无法为您提供帮助,因为没有数据库间事务之类的东西,您必须自己实现它。

我什至想过自己重写 pg-promise 模块的某些部分

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

【讨论】:

  • 感谢您的回答。使用两个数据库连接可能是一个想法,但为了执行两阶段提交,我希望这两个对象进行通信,以便知道它们是否以及何时可以实际写入数据库。可以通过 dbContext 参数对其进行参数化吗?
  • @Pikuni dbContext 参数有助于在扩展、事件日志等方面区分这两个数据库。但是它们之间的通信完全取决于您,对于数据库对象完全相互独立。
  • 好的,这让事情更清楚了。但是,恐怕 pg-promise 的一般功能不适合这种情况。事实上,我需要在两个数据库上准备一个类似的事务,就像PGSQL documentation 中描述的那样。据我所见,在 pg-promise 中,交易的整个处理方式(以正常方式)是不同的。而且我看不到如何使用准备好的语句来代替它。
  • @Pikuni pg-promise 的一般功能可以满足任何一般用途,包括可能需要的任何自定义事务逻辑。而且我不确定准备好的语句与它有什么关系,它只是一种查询。
  • 抱歉,使用了错误的 URL 并混淆了准备好的语句和准备事务命令,尽管没有连接。我的意思是prepared transactions
【解决方案2】:

我已经搜索并没有找到任何用于分布式事务管理的 node.js 模块。

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

postgresql 有 two phase commit support,因此构建块可以用于 XA 支持或手动发布的 postgresql 特定实现。

我自己正在开发一个类似 XA 的事务管理器,但是工作和孩子的进度会很慢;副业项目排在最后。在一两年内寻找ivolucien/coaction...

【讨论】:

  • 感谢您的回答。我会与您的工作保持联系,因为正如您所提到的,似乎没有用于分布式事务管理的节点模块。至于我,我通过使用 PgPool II 中间件在两个主数据库之间分配事务来解决这个问题。不幸的是,PgPool II 并不是为此目的而设计的,而且实施起来非常痛苦。所以我认为节点社区绝对可以使用你的工作。 ;)
猜你喜欢
  • 1970-01-01
  • 2011-11-15
  • 1970-01-01
  • 2011-11-24
  • 2013-05-21
  • 2014-06-06
  • 2018-08-15
  • 1970-01-01
相关资源
最近更新 更多