Асинхронный пул соединений QCP
Асинхронный пул соединений (Quantum Connection Pool или QCP) обеспечивает подключение и поддержку связи с удаленными клиентами.
Общий принцип работы
QCP принимает входящие подключения от удалённых клиентов по адресу listening_address
(по умолчанию — 0.0.0.0:8080
) и "проксирует" их серверам баз данных, перечисленных
в настройке servers
. Соединения до серверов устанавливаются (и завершаются) автоматически, по мере необходимости.
В зависимости от режима работы, задаваемого параметром relay_mode
, проксирование данных от
клиентов к серверам осуществляется одним из следующих способов:
relay_mode: Session
: при первом обращении к серверу, клиенту выделяется уникальное соединение до базы данных, которое возвращается в пул только при отключении клиента.relay_mode: Smart
: при обращении к серверу, клиенту выделяется уникальное соединение до базы данных, которое возвращается в пул тогда и только тогда, когда в ответе от сервера будет стоять флаг "Idle" (PostgreSQL Documentation: Message Formats, сообщениеReadyForQuery
).
С полным описанием настроек можно ознакомиться в примере конфигурационного файла qcp/config-example.yaml.
Запуск и работа
Запуск осуществляется с помощью утилиты qcp
(qcp --help
для списка опций), остановка — утилитой
qcp-ctrl
(qcp-ctrl --help
для списка опций). Например, чтобы остановить запущенный экземпляр
QCP, необходимо выполнить команду qcp-ctrl quit
.
Вывод логов в процессе работы QCP контролируется настройкой log_output
(см.
qcp/config-example.yaml), при этом уровень логирования задаётся настройкой log_level
(подробнее
про уровни логирования смотри — LevelFilter). Например,
чтобы выводить логи уровня Info
и выше в файл /tmp/qcp.log
, необходимо задать следующие
настройки в файле конфигурации:
log_level: Info
log_output:
file: /tmp/qcp.log
Потребление памяти
При старте программы единовременно выделяется количество памяти, указанное в разделе arena
файла
конфигурации:
# Конфигурация памяти (опционально)
arena:
chunk_size: 66560 # Размер одного "куска" памяти, в байтах
# Общее количество потребляемой памяти можно указать либо используя параметр
# "количество кусков памяти":
chunks_count: 3150 # Количество таких "кусков"
# ... или указав общее количество напрямую:
total_size: 3.1 GB # Поддерживаются суффиксы B, KB, MB, GB