Узел Postgres Pub / Sub - оставшиеся слоты подключения зарезервированы - PullRequest
0 голосов
/ 14 декабря 2018

Я построил систему уведомлений с node-postgres и socket.io.Система работает нормально, однако, я получаю сообщение об ошибке при запуске.

оставшиеся слоты подключения зарезервированы для подключений суперпользователя без репликации

Я подозреваю, что это связано сне освобождает клиента обратно в пул.

Pool.connect()
    .then(client => {
        return client.query('LISTEN "new_notification"')
            .then(result => {
                client.on('notification', data => {
                    // Handle the notification
                });
                // Should release here
            })
            .catch(e => {
                // Should release here
                this.log(e.message, 'error');
            });
        })
    .catch(e => {
        this.log(e.message, 'error')
    });

Однако даже после добавления client.release() в местах, где отмечены // Should release here, я все равно получаю сообщение об ошибке.Тем не менее, уведомление все еще работает.

Когда сервер запускается, он создает один HeyListen объект, в котором также создается Pool выше.

Теперь вышеприведенная ошибка обычно происходит, когда сервер запускается и залит соединениями.Есть 6 сайтов, которые обрабатывают соединения с пользователями.Каждый пользователь создает новое соединение с сервером socket.io, и когда событие disconnecting запускается через socket.io, они удаляются из списка подключенных пользователей.Каждый раз, когда пользователь подключается, он запускает запрос к postgres, если у него есть ожидающие уведомления.Вот объект запроса:

const conn = this.getConnectionType(pool);
conn.connect()
    .then(client => {
        return client.query(query_string, params)
            .then(result => {
                client.release();
                callback(null, result);
            })
            .catch(error => {
                client.release();
                callback(error, null);
            });
    })
    .catch(error => {
        callback(error, null);
    });

Если я запускаю Select * From pg_stat_activity на моем сервере psql, я вижу:

enter image description here

Я думалиспользование client.release() должно было удалить эти соединения?При повторном выполнении запроса выше отображаются разные результаты запроса, поэтому некоторые из них удаляются.Это проблема нехватки max_connections?Если да, то стоит ли увеличить это число для моего варианта использования?

1 Ответ

0 голосов
/ 14 декабря 2018

Экспериментируя с моей собственной функциональностью клиента pub / sub для Node.js и PostgreSQL, я видел эту ошибку, когда у меня заканчивались пригодные для использования соединения.Если я правильно помню, проблема, с которой вы сталкиваетесь, заключается в том, что с пакетом node-postgres соединение, используемое с LISTEN, считается активным и используется базовым пулом соединений до тех пор, пока клиент не прекратит прослушивание с UNLISTEN.

Однако, если вы прекратите прослушивание данного соединения, вы больше не будете получать эти полезные notification события.Немного дилеммы.

Если возможно, я бы посоветовал вам рассмотреть вопрос о настройке меньшего количества выделенных соединений, специально для прослушивания различных каналов через PostgreSQL в каждом из ваших шести приложений, а затем использовать отдельные соединения.выполнить ваши дополнительные запросы.Я не знаю, насколько это осуществимо или эффективно с вашей текущей нагрузкой на трафик, но теоретически это должно снизить вероятность использования всех доступных соединений из пула.

Из любопытства, что было вашим обоснованиемиметь подключение каждого пользователя LISTEN для уведомлений самостоятельно?Можно передать полезную нагрузку слушателям с по NOTIFY, поэтому, если у вас есть какие-то средства идентификации отдельного пользователя, вы можете отправить своим шести приложениям полезную нагрузку, в которой объявляется, для какого пользователя предназначено уведомление, и для каждогоиз ваших шести приложений может перенаправить эту информацию на правильное подключение пользователя.

...