options.pool.validate в sequelize node js - PullRequest
0 голосов
/ 14 апреля 2020

Postgres имя последовательности - post_seq

Запрос SELECT для получения следующей последовательности - select nextval(post_seq)

Использование sequelize v5.x

конфигурация пула -

{
      max: 10,
      min: 1,
      acquire: 30000,
      idle: 10000,
      validate: async pgClient => {
        const result = await pgClient.query('SELECT pg_is_in_recovery()');
        const isReadOnly = result.rows[0].pg_is_in_recovery;
        console.log(isReadOnly, 'isReadOnly:src/utils/db.js')
        return !isReadOnly;
      }
    }

Ожидание -

options.pool.validate вызывается для всех запросов, выполняющихся в приложении, включая вышеупомянутый запрос SELECT, чтобы получить следующий идентификатор последовательности

Что происходит -

options.pool.validate вызывается только для невыбранных запросов

Я предполагаю, что это стандартное поведение sequelize. Если это так, то какой другой способ заставить запросы SELECT использовать только доступное для записи соединение? Причина этого ожидания заключается в том, что во время AWS RDS Failover соединение с устройством чтения не может быть использовано для выполнения вышеуказанного запроса SELECT, поскольку nextval() не является просто запросом выбора. Если есть способ вызвать options.pool.validate для этого запроса SELECT, sequelize отбросит это соединение перед выполнением этого запроса nextval() из-за используемой конфигурации пула. На данный момент ошибка, которую я получаю в журналах сервера, выглядит следующим образом:

SequelizeDatabaseError: cannot execute nextval() in a read-only transaction\n

Несколько других моментов, на которые следует обратить внимание -

  1. Я подключаюсь к конечной точке модуля записи кластера в nodejs приложение
  2. Я использую запрос 'SELECT pg_is_in_recovery()', чтобы проверить, доступно ли используемое соединение только для чтения. Если он доступен только для чтения, соединение сбрасывается с помощью sequelize.
  3. Я попытался использовать useMaster:true в конфигурации пула, и, похоже, это не помогает в сценарии отработки отказа. Вероятно, это полезно в основном в случае репликации, а не настройки DR.
...