有没有办法在启用复制的Sequelize连接上设置2个单独的数据库池?

时间:2018-02-24 05:13:57

标签: node.js heroku optimization database-connection sequelize.js

Read Replication Docs

我基本上试图解耦主设备和从设备之间的连接数,以便最大化可用连接的数量并在我的只读副本中加载。我目前正在为Heroku托管的应用程序(40个dynos)快速轻松地进行优化,当应用程序达到峰值时,该应用程序目前处于连接限制状态。

我尝试使用pgbouncer-stunnel优化请求吞吐量的尝试都失败了,我想知道Sequelize汇集是否与pgbouncer的游戏池打得不好。我没有尝试的一件事就是设置pool: false(我在Sequelize版本3上)。当然,我需要进行其他优化,但增加只读连接的数量可以减轻此应用程序遇到的最大量。

我们如何实例化postgres的示例Sequelize postgres连接如下:

    let seqOptions: Sequelize.Options = {
        dialect: 'postgres',
        logging: function (sql: string) {
            if (pgConfig.logging) {
                helpers.logDebug('sequelize ' + sql);
            }
        },
        pool: {
            maxConnections: pgConfig.maxConnections,
            minConnections: pgConfig.minConnections,
        },

        define: {
            timestamps: false // true by default
        },

        timezone: config.timezone
    };

    if (config.pg.useSSLDBConnection) {
        seqOptions.dialectOptions = {
            ssl: config.pg.useSSLDBConnection,
            timeout: 10,
            returning: true
        };
    };

    if (config.pg.useReadReplication && !config.pg.separateReadWrite) {
        let masterUrl = url.parse(config.pgWrite.url);
        let username = masterUrl.auth.split(':')[0];
        let password = masterUrl.auth.split(':')[1];
        let databaseName = masterUrl.path.split('/').pop();
        seqOptions.replication = {
            write: {
                host: masterUrl.hostname,
                port: masterUrl.port,
                database: databaseName
            },
            read: _.map(config.pgReadReplicas, (readUrl) => {
                let _readUrl = url.parse(readUrl);
                let databaseName = _readUrl.path.split('/').pop();
                return ({
                    host: _readUrl.hostname,
                    port: _readUrl.port,
                    database: databaseName
                });
            })
        };

        let connection = new Sequelize(null, username, password, seqOptions);
        return new SQLContext(connection);

0 个答案:

没有答案