Впровадження пулінгу з’єднань і сталих з’єднань у проектах Django REST

Розуміння необхідності

📚 З'єднання з базою даних споживають ресурси. Створення та закриття з'єднання для кожного запиту є неефективним, особливо під великим навантаженням. Тут на допомогу приходять сталими з'єднання та пулінг з'єднань для оптимізації взаємодії з базою даних.

Сталі з'єднання

🔄 Стале з'єднання залишається відкритим на визначений період, повторно використовуючи одне і те ж з'єднання для кількох запитів. Це зменшує накладні витрати на повторне встановлення з'єднань.

Як увімкнути сталi з'єднання в Django

Сталі з'єднання в Django контролюються параметром CONN_MAX_AGE у налаштуваннях DATABASES. Цей параметр вказує максимальний час життя з'єднання з базою даних. 🛠️

  • За замовчуванням: За замовчуванням CONN_MAX_AGE встановлено на 0, що означає, що з'єднання закривається наприкінці кожного запиту. ⚙
  • Налаштування CONN_MAX_AGE: Щоб увімкнути сталі з'єднання на певний період, встановіть значення на позитивне число (в секундах). Для безмежних сталих з'єднань встановіть значення на None. ♾️

Приклад конфігурації

DATABASES = {  
 'default': {  
 'ENGINE': 'django.db.backends.postgresql',  
 'NAME': 'your_database',  
 'USER': 'your_username',  
 'PASSWORD': 'your_password',  
 'HOST': 'localhost',  
 'PORT': '5432',  
 'CONN_MAX_AGE': 300, # З'єднання залишається відкритим протягом 300 секунд  
 },  
}

Кращі практики для сталих з'єднань

✔️ Якщо сервер бази даних припиняє неактивні з'єднання, встановіть CONN_MAX_AGE на значення, яке буде менше тайм-ауту сервера. Використовуйте CONN_HEALTH_CHECKS = True, щоб перевіряти стан з'єднання під час кожного запиту і уникати помилок, коли неактивні з'єднання припиняються.

Попередження

⚠️ Сталі з'єднання можуть призвести до конкуренції за ресурси на сервері бази даних, якщо ними не керувати обережно. Вони краще підходять для додатків зі середнім або високим трафіком.

Пулінг з'єднань

🔄 Пулінг з'єднань підтримує пул повторно використовуваних з'єднань з базою даних. Коли запит потребує з'єднання, воно повторно використовує існуюче з пулу замість того, щоб відкривати нове з'єднання.

Переваги пулінгу з'єднань

  • Зменшує накладні витрати на встановлення з'єднання. 💡
  • Забезпечує кращу продуктивність для додатків з високою конкуренцією запитів. 🚀
  • Дозволяє більш ефективно керувати ресурсами бази даних. ⚡

Пулінг з'єднань у Django 5.1 та вище

Починаючи з Django 5.1, з'явилася вбудована підтримка пулінгу з'єднань для PostgreSQL за допомогою драйвера psycopg. 🐘

Як увімкнути пулінг з'єднань

Щоб увімкнути пулінг з'єднань, додайте словник pool у налаштування OPTIONS вашої конфігурації бази даних.

Приклад конфігурації

DATABASES = {  
 'default': {  
 'ENGINE': 'django.db.backends.postgresql',  
 'NAME': 'your_database',  
 'USER': 'your_username',  
 'PASSWORD': 'your_password',  
 'HOST': 'localhost',  
 'PORT': '5432',  
 'OPTIONS': {  
 'pool': {  
 'min_size': 2, # Мінімальна кількість з'єднань у пулі  
 'max_size': 4, # Максимальна кількість з'єднань у пулі  
 'timeout': 10, # Час (в секундах), який треба чекати для з'єднання  
 },  
 },  
 },  
}

Як це працює

  • Пул підтримує певну кількість з'єднань (min_size до max_size). 🔢
  • З'єднання повторно використовуються, зменшуючи потребу створювати нові. 🔁
  • Якщо всі з'єднання використовуються, додаток чекає, поки одне з'єднання не стане доступним (до досягнення часу очікування timeout). ⌛

Що вибрати?

🤔 Використовуйте сталі з'єднання, якщо ваш додаток має помірний трафік і ви хочете просте налаштування.

🚀 Використовуйте пулінг з'єднань для додатків з високою конкуренцією запитів, де ефективне управління з'єднаннями є критично важливим.

Висновок

Як сталі з'єднання, так і пулінг з'єднань є потужними інструментами для оптимізації продуктивності бази даних у додатках Django. Розуміння трафіку вашого додатка та поведінки бази даних є ключовим фактором у виборі правильного підходу.
Для версій Django нижче 5, ви обмежені сталими з'єднаннями, але починаючи з Django 5.1, вбудований пулінг з'єднань надає більш надійний варіант для PostgreSQL. 🎯

Щасливого кодування! 🚀

Джерела

Перекладено з: Implementation of Connection Pooling and Persistent Connections in Django REST Projects

Leave a Reply

Your email address will not be published. Required fields are marked *