Использование URI соединения с Read Replication в Sequelize - PullRequest
2 голосов
/ 10 января 2020

Если у меня есть URI соединения, я обычно могу использовать его с Sequelize следующим образом:

const sequelize = new Sequelize('postgres://user:pass@example.com:5432/dbname');

Однако, если я хочу использовать репликацию чтения и записи (https://sequelize.org/master/manual/read-replication.html ), то не представляется возможным использовать URI соединения. Можно ли передать строки URI подключения для чтения и записи в параметре репликации, например:

const sequelize = new Sequelize(null, null, null, {
  dialect: 'postgres',
  replication: {
    read: [
      'postgres://user:pass@reader.example.com:5432/dbname',
      'postgres://user:pass@anotherreader.example.com:5432/dbname'
    ],
    write: 'postgres://user:pass@writer.example.com:5432/dbname'
  }
})

РЕДАКТИРОВАТЬ:

Я уже нашел решение этой проблемы. и это использует библиотеку npm, такую ​​как строка подключения , для анализа строки подключения, как показано ниже:

const write_uri = new ConnectionString(uri);
const sequelize = new Sequelize(null, null, null, {
  dialect: 'postgres',
  replication: {
    read: [
      'postgres://user:pass@reader.example.com:5432/dbname',
      'postgres://user:pass@anotherreader.example.com:5432/dbname'
    ],
    write: {
      host: write_uri.hosts[0].name,
      username: write_uri.user,
      password: write_uri.password,
      database: write_uri.path[0],
      port: write_uri.hosts[0].port
    }
  }
});

Но это не то, что я ищу.

Ответы [ 3 ]

1 голос
/ 13 января 2020

В соответствии с источником секвелирования в мастере, вы не можете.

В соответствии с документами источника секвелирования в секвелировать. js, конструктор секвелирования принимает options агрумент, как this

constructor(database, username, password, options){

}

Где options.replication должен быть объектом с двумя свойствами: чтение и запись. Запись должна быть объектом (один сервер для обработки записей) и считывать массив объектов (несколько серверов для обработки операций чтения). Каждый сервер чтения / записи может иметь следующие свойства: host, port, username, password, database.

, вам необходимо передать массив objects в read:[] со значениями соединения в качестве реквизита вместо передачи strings.

1 голос
/ 13 января 2020

Ссылаясь на официальные документы sequelize -

Sequelize поддерживает репликацию чтения, т.е. имеет несколько серверов, к которым можно подключиться, когда вы хотите выполнить запрос SELECT. Когда вы выполняете репликацию чтения, вы указываете один или несколько серверов, которые будут действовать как реплики чтения, и один сервер, который будет действовать как мастер записи, который обрабатывает все записи и обновления и распространяет их на реплики (обратите внимание, что фактический процесс репликации не обрабатывается. Sequelize, но должен быть настроен сервером базы данных).


const sequelize = new Sequelize('database', null, null, {
  dialect: 'mysql',
  port: 3306
  replication: {
    read: [
      { host: '8.8.8.8', username: 'read-username', password: 'some-password' },
      { host: '9.9.9.9', username: 'another-username', password: null }
    ],
    write: { host: '1.1.1.1', username: 'write-username', password: 'any-password' }
  },
  pool: { // If you want to override the options used for the read/write pool you can do so here
    max: 20,
    idle: 30000
  },
})

0 голосов
/ 12 января 2020

Вы можете передать объект конфигурации в конструктор последовательностей, даже если вы используете URI-соединение. Посмотрите пример из документов: https://sequelize.org/master/class/lib/sequelize.js~Sequelize.html#instance -конструктор-конструктор

// с uri

const sequelize = new Sequelize('mysql://localhost:3306/database', {})

Посмотрите на определение перегрузки конструктора:

Sequelize(uri: string, options?: Sequelize.Options): Sequelize.Sequelize

Просто передайте нужные параметры.

...