Двухфазная фиксация в приложении 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
через год или два...