Двухфазная фиксация в приложении nodeJS

В настоящее время я работаю над приложением nodeJS, которое вскоре должно будет писать одновременно в двух базах данных PostgreSQL. Это предназначено для целей резервирования: операции записи должны выполняться одновременно в обеих базах данных или откатываться, если с одной из баз данных что-то не так.

Чтобы достичь этого, мне нужно положиться на менеджера транзакций, который будет (или, по крайней мере, мог бы) использовать двухфазную фиксацию в постоянном процессе.

В настоящее время приложение использует готовое решение для выполнения действий с текущей базой данных (т. Е. Пакетом pg-обещания, который на данный момент выступает в качестве менеджера транзакций приложения).

Короче говоря, мне нужно, чтобы каждое постоянное действие в приложении Node выполнялось одновременно на двух базах данных.

Сейчас я просто использую pg-обещание для сохранения данных в одной базе данных, как в этом примере:

db.one(mySQLRequest)

но я нашел только создать объект БД для одной конкретной базы данных за один раз.

Я не нашел примеров такой огромной проблемы в приложении NodeJS RESTful, но я подозреваю, что это может быть довольно распространенной проблемой. И я был бы рад, если бы не было необходимости самостоятельно перекодировать весь менеджер транзакций...

Если у вас есть какие-либо сведения о том, как я могу разрешить моему приложению NodeJS выполнять двухфазные коммиты, это будет с благодарностью.:)

2 ответа

Решение

приложение nodeJS, которое вскоре будет необходимо писать одновременно в нескольких базах данных PostgreSQL

В рамках pg-обещания каждый объект базы данных содержит отдельный пул соединений с уникальным соединением.

Таким образом, при взаимодействии с несколькими базами данных вы просто создаете один объект базы данных для каждой, и в этом сценарии также полезно использовать 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-обещание сам

Я не вижу, что это может дать вам. Части, которые можно автоматизировать для транзакций, уже есть, а части для обеспечения целостности базы данных находятся на вашей стороне.

Я искал и не нашел ни одного модуля node.js для управления распределенными транзакциями.

Если вы работаете над своими собственными усилиями, взгляните на транзакции XA, стандарт транзакций распределенной базы данных. Java имеет надежную и развитую поддержку через JTA (Java Transaction API), который помогает разработчику узла только в качестве вдохновения и справочной информации.

У postgresql есть поддержка двухфазной фиксации, так что есть строительные блоки для поддержки XA или для конкретной реализации postgresql.

Я сам работаю над менеджером транзакций XA, но работа и дети будут медленными; сторонние проекты являются последними в очереди на время. Ищу ivolucien/coaction через год или два...

Другие вопросы по тегам