являются обратными вызовами JavaScript - PullRequest
0 голосов
/ 04 февраля 2019

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

router.post ('url', function(req,res,next) {

    third_party_api_1.set_a (req.body.param, function(err, a) {

        third_party_api_2.set_b (req.body.param, function(err, b) {
            res.end()
        })

    })

})

Если сообщение конечного пользователя (param = 1), я ожидаю (a = b = 1).Если они публикуют (param = 2), я ожидаю (a = b = 2).Если два пользователя публикуют (param = 1) и (param = 2) одновременно, будут ли a и b в сторонних базах данных всегда равны?Я понимаю, что они могут быть 1 или 2 в зависимости от времени, но я хочу убедиться, что это либо (a = b = 1), либо (a = b = 2), но не (a = 1, b = 2) или (a = 2, b = 1).

Другими словами, set_a и set_b будут "атомарными"?

Спасибо!

РЕДАКТИРОВАТЬ # 1:«a» - это одно значение в сторонней базе данных, «b» - это еще одно значение в другой сторонней базе данных, я хотел бы, чтобы пользователь отправил одно значение, и мой код заменяет и a, и b на это значение пользователя.

РЕДАКТИРОВАТЬ # 2: У меня нет прямого контроля над сторонними базами данных, я могу только вызвать публичный API.Возможно, мне нужен мьютекс вокруг вызовов API?Как я могу это реализовать?

Ответы [ 3 ]

0 голосов
/ 04 февраля 2019

Вопрос относится к согласованности базы данных, когда ваша архитектура будет более ответственной за поддержание согласованности в распределенном хранилище.

Например: рассмотрим MongoDB с сегментированным развертыванием и репликацией, независимо от вашего запроса, хранилище будет более ответственным за создание непротиворечивых данных после последнего вызова вашего запроса.

0 голосов
/ 04 февраля 2019

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

router.post ('url', function(req,res,next) {
    api1.setA(req.body.param);
    api2.setB(req.body.param);
 });

Вы также должны рассмотреть, что произойдет, если ваше приложение будет развернуто на наборе веб-серверов с балансировкой нагрузки.

Трудно рекомендовать решение, не зная больше о базах данных, которые вы на самом деле обновляете.Они полностью непрозрачны или службы находятся перед какой-то реляционной базой данных / базой документов?

0 голосов
/ 04 февраля 2019

Вы, похоже, спрашиваете о «согласованности» между двумя распределенными системами, а не атомарностью.

То, что вы спрашиваете, на самом деле является скорее архитектурным вопросом, нежели чем-то специфическим для JavaScript.Если вы совершаете звонки в два разных хранилища данных, вам потребуются некоторые средства для обеспечения согласованности этих двух конечных точек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...