Стендап Сьогодні 📢 Канал в Telegram @stendap_sogodni

🤖🚫 Контент вільний від AI. Цей пост на 100% написаний людиною, як і все на моєму блозі. Насолоджуйтесь!

27.12.2022

Налаштування пулу підключень у Ruby on Rails

Повертаючись в більш рутинні питання — відкрив як важливо не забути про налаштування пулу підключень у Ruby on Rails.

За замовчуванням розмір пула встановлюється відповідно до значення змінної оточення RAILS_MAX_THREADS. Це гарно працює для звичайного вебсерверу, який так само прочитає кількість паралельних потоків з цієї змінної. Корисно знати, що Sidekiq також візьме рівень паралелізації з тієї самої змінної. Тож єдине налаштування RAILS_MAX_THREADS вирішить як питання паралелізації, так і розміру пулу підключень до бази даних (Звісно, встановлювати змінну для вебсервера та для сервера задач треба окремо.)

Але ця змінне — це тільки домовленість, та не всі бібліотеки її виконують. Так сталося з бібліотекою gruf, яка у нас використовується для gRPC. Там паралелізація налаштовується окремо, а за замовчуванням значення береться з гему gRPC.

Тут нас очікувала халепа — бо у гемі gRPC за замовчуванням стоїть 30 паралельних потоків, а у RAILS_MAX_THREADS значення за замовчуванням тільки 5. Тобто 30 потоків RPC ділили 5 підключень до бази даних.

Проблема в тому, що відразу цього не помітиш. Поки запити до бази швидкі, а навантаження низьке, то потоки будуть успішно вишукуватись в чергу та чекати вільного підключення. Тож замість голосної помилки отримуємо тихе уповільнення. На щастя, наші останні зміни впровадили більш повільні запити, яки займали підключення довше. Оскільки на очікування в черзі є межа у 5 секунд, наш сервер RPC почав сваритись на відсутність вільних підключень.

Вирішилось все використанням RAILS_MAX_THREADS як кількості потоків RPC - тож і вам раджу у своїх проєктах слідувати цій корисній конвенції.