运行两个NodeJS实例导致Firebase事务=> MYSQL重复

时间:2019-03-15 11:44:22

标签: mysql node.js firebase transactions

我正在尝试一个可以在负载均衡器后水平缩放的系统。

这是基本架构: architecture

当我添加多个Node JS实例时,我将对SQL表进行多次添加。 例如,我要向'/ messages_out'批量添加1000条消息,并且两个(或多个)节点实例旨在从firebase中删除该条目,并将其作为事务保留在SQL表中。

我猜我对Promise /一般方法的使用是错误的,但是尝试了各种“链”并查找了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;

0 个答案:

没有答案