Чому ми обрали Go для SaaS-бекенду у fluxLab.dev
Як fluxLab.dev перейшов з Node.js на Go для продакшн SaaS-бекендів і досяг 3-кратного покращення пропускної здатності зі зниженням споживання памяті.
Вступ
У fluxLab.dev ми створюємо та підтримуємо шість продакшн SaaS-продуктів, якими користуються понад 46 000 користувачів. Коли ми почали розробляти Jobber — наш трекер пошуку роботи з ШІ — ми свідомо обрали Go замість Node.js для бекенду. Ось чому і що ми дізнались.
Проблеми Node.js на масштабі
Node.js добре нам служив для ранніх продуктів — WashFlow та EFluxCom. Але зі зростанням навантаження з'явились типові проблеми:
- Споживання пам'яті зростало непередбачувано під навантаженням
- CPU-інтенсивні операції (генерація PDF, парсинг відповідей ШІ) блокували event loop
- Залежності роздували Docker-образи, уповільнюючи деплой
- Обробка помилок в ланцюжках async/await ставала складною для трейсингу
Нам було потрібне рішення з кращими примітивами конкурентності, нижчим споживанням ресурсів та простішим деплоєм.
Чому Go?
Після оцінки Rust, Go та варіанту залишитись на Node.js з worker threads, ми обрали Go з кількох причин:
Модель конкурентності
Горутини та канали Go обробляють тисячі одночасних з'єднань з мінімальними накладними витратами. Для Jobber, де користувачі одночасно запускають парсинг вакансій через ШІ, синхронізацію календаря та обробку вебхуків — це було критично.
Компіляція та деплой
Один статичний бінарний файл. Без node_modules, без runtime-залежностей. Docker-образи зменшились з 400МБ до 12МБ. CI/CD пайплайни працюють у 4 рази швидше.
Стандартна бібліотека
Стандартна бібліотека Go покриває HTTP-сервери, роботу з JSON, криптографію та драйвери баз даних без зовнішніх залежностей. Ми використовуємо лише кілька сторонніх пакетів: pgx для PostgreSQL, chi для маршрутизації та golang-migrate для міграцій.
Обробка помилок
Явна обробка помилок у Go спочатку здавалась багатослівною, але виявилась безцінною на продакшні. Кожен шлях помилки видимий, залогований та оброблений.
Результати після 6 місяців
Порівняння Go-бекенду Jobber з аналогічними Node.js-сервісами:
- Пам'ять: 30МБ в простої проти 180МБ (зниження в 6 разів)
- Пропускна здатність: 12 000 запитів/с проти 4 000 на тому ж залізі
- P99 латентність: 8мс проти 25мс для API-ендпоінтів
- Docker-образ: 12МБ проти 400МБ
- Холодний старт: 50мс проти 2с
Висновок
Для CPU-ефективних, легких по пам'яті бекенд-сервісів, яким потрібно надійно обробляти конкурентні навантаження, Go став очевидним вибором для fluxLab.dev. Якщо ви будуєте SaaS-продукт і впираєтесь у стіни масштабування з Node.js — Go заслуговує на серйозний розгляд.