Запуск двух экземпляров NodeJS, вызывающих транзакцию Firebase => MYSQL Duplicates - PullRequest
0 голосов
/ 15 марта 2019

Я пытаюсь установить систему, которая может быть горизонтально масштабирована за балансировщиком нагрузки.

Вот базовая архитектура: architecture

Когда я добавляю более одного экземпляра Node JS, я получаю несколько дополнений к таблице SQL. Например, я добавляю 1000 сообщений навалом к ​​/ messages_out, и два (или более) экземпляра узла предназначены для удаления записи из firebase, а также для ее сохранения в таблице SQL в качестве транзакции.

Я предполагаю, что мое использование обещаний / общего подхода неверно, но я пробовал различные "цепочки" и искал методы и примеры для firebase и не могу заставить его работать. Это мое первое знакомство с Node / JS / Firebase ...

Любая помощь будет принята с благодарностью.

const log4js = require('log4js');
const logger = log4js.getLogger();
logger.level = 'debug';

var admin = require('firebase-admin');
var Sequelize = require('sequelize');

const sequelize = new Sequelize('lachat', 'la-admin', 'password', {
    host: '10.5.11.43',
    dialect: 'mysql',
    pool: {
        max: 100,
        min: 5,
        acquire: 30000,
        idle: 10000
    }
});

const InboundMessage = sequelize.define('inbound_message', {
    sender: {
        type: Sequelize.STRING
    },
    message: {
        type: Sequelize.STRING
    },
    target: {
        type: Sequelize.STRING
    }
});

watcher = admin.database().ref('/messages_out').on('child_added', (snap) => {
    logger.debug(`GOT MESSAGE IN => ${JSON.stringify(snap.val())}`);

    //Grab it and delete...
    //Persist it
    const snapshot = snap.val();
    admin
        .database()
        .ref(snap.ref)
        .transaction(() => {
            return admin.database().ref(snap.ref).remove();
        })
        .then(() => {
            return InboundMessage.create({
                sender: snapshot.sender,
                message: snapshot.message,
                target: snapshot.target
            });
        })
        .then((persisted) => {
            logger.debug('SUCCESS');
        })
        .catch((err) => {
            return Promise.reject(err);
        });
});

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