Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+717новых вакансий за сутки·60 871вакансия открыта сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 951
РезюмеAIПодготовкаСтатьи
ТарифыТарифы
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 391 кандидат открыт к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python9 224
  • Облачные технологии4 076
  • QA вакансии1 588
  • Android1 322
  • Инженер данных805
  • Продакт-менеджер368

Разработка

  • Backend вакансии1 317
  • iOS1 239
  • AI вакансии608
  • Fullstack вакансии523
  • Frontend вакансии456
  • Mobile вакансии28

По стеку

  • Go5 445
  • Java3 175
  • Kotlin1 119
  • Node.js1 026
  • Rust949
  • .NET666
  • PHP311
  • C#210
  • C++204

DevOps и инфраструктура

  • DevOps вакансии2 713
  • Kubernetes2 308
  • Linux-инфраструктура1 890
  • Terraform / IaC1 406
  • CI/CD842
  • Мониторинг и Observability645
  • SRE226
  • Кибербезопасность84

Аналитика и данные

  • Аналитик данных483
  • Data Scientist469
  • Бизнес-аналитик349
  • Системный аналитик48

Другие направления

  • Проджект-менеджер139
  • UI/UX дизайн71
  • Ручное тестирование14

По регионам

  • Вакансии в США24 791
  • Вакансии в Европе9 439
  • Работа в России2 924
  • Вакансии в Канаде2 178

По формату

  • Удалённые вакансии43 505
  • Релокация в США24 791
  • Гибридная работа3 370
  • Офисная работа2 525

По уровню

  • Senior вакансии20 898
  • Middle вакансии12 438
  • Junior вакансии3 864

Сейчас нанимают

Все компании
  • Wise191 вакансия
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis48 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме SQLAlchemyВсе вопросы
SQLAlchemySeniorПроектирование систем

Что такое пул соединений и какие настройки важны для продакшена (pool_size, max_overflow, pool_timeout)?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

pool_size — базовое число постоянных соединений; max_overflow — дополнительные на пике; pool_timeout — ожидание свободного слота; pool_recycle — пересоздание соединений для защиты от NAT/DB-таймаутов; pool_pre_ping=True обязателен в production.

Что такое пул соединений и зачем он нужен

Создание нового TCP-соединения с PostgreSQL — дорогая операция (несколько десятков миллисекунд, TLS-хендшейк, аутентификация). Пул соединений держит набор уже открытых соединений и выдаёт их запросам по требованию. SQLAlchemy использует QueuePool по умолчанию.

Ключевые параметры

from sqlalchemy import create_engine
from sqlalchemy.pool import QueuePool

engine = create_engine(
    "postgresql+psycopg2://user:pass@localhost:5432/mydb",
    # Базовое число постоянных соединений в пуле
    pool_size=10,
    # Дополнительные "временные" соединения поверх pool_size
    # Максимум активных соединений = pool_size + max_overflow
    max_overflow=20,
    # Секунд ждать свободное соединение, прежде чем бросить TimeoutError
    pool_timeout=30,
    # Пересоздавать соединение через N секунд (защита от таймаутов БД/NAT)
    pool_recycle=1800,
    # Проверять соединение SELECT 1 перед выдачей из пула
    pool_pre_ping=True,
    # Размер очереди ожидания (по умолчанию равен pool_size + max_overflow)
    # pool_use_lifo=True,  # LIFO: чаще используются "свежие" соединения (прогреты кешем)
)

Как выбрать значения для production

# Правило расчёта:
# max_connections (pg) >= (pool_size + max_overflow) * num_workers
#
# Пример: 4 gunicorn workers, PostgreSQL max_connections=100
# (10 + 10) * 4 = 80 <= 100 — ок
# Оставляем 20 для psql, monitoring, migrations

# Рекомендации по значениям:
# pool_size     = CPU workers * 2 (или = числу core приложения)
# max_overflow  = pool_size * 1-2  ("буфер" для пиков)
# pool_timeout  = 10-30 сек (зависит от SLA)
# pool_recycle  = 1800 (30 мин) — меньше idle_timeout вашей БД
# pool_pre_ping = True — всегда в production

Async Engine: те же параметры

from sqlalchemy.ext.asyncio import create_async_engine

async_engine = create_async_engine(
    "postgresql+asyncpg://user:pass@localhost/mydb",
    pool_size=10,
    max_overflow=20,
    pool_timeout=30,
    pool_recycle=1800,
    pool_pre_ping=True,
)

Мониторинг состояния пула

def get_pool_status(engine) -> dict:
    pool = engine.pool
    return {
        "pool_size": pool.size(),
        "checked_out": pool.checkedout(),  # активно используются
        "overflow": pool.overflow(),       # временных сверх pool_size
        "available": pool.checkedin(),     # свободных в пуле
    }

# Для Prometheus/Grafana — экспортируем как gauge-метрики

NullPool: когда пул не нужен

from sqlalchemy.pool import NullPool

# Serverless (AWS Lambda, Cloud Functions) — каждый invocation изолирован
# Alembic migrations — нет смысла держать соединения
# Тесты с изолированными транзакциями
engine = create_engine(DATABASE_URL, poolclass=NullPool)

PgBouncer: пул на уровне инфраструктуры

При многих инстансах приложения (K8s pods) SQLAlchemy-пул в каждом pod умножается на число инстансов. Решение — PgBouncer в transaction pooling mode: он объединяет соединения от всех pods и держит их в пуле на уровне инфраструктуры.

# При использовании PgBouncer в transaction mode
# отключить prepared statements (они не поддерживаются в transaction mode)
engine = create_engine(
    "postgresql+psycopg2://user:pass@pgbouncer:6432/mydb",
    pool_size=5,       # меньше — PgBouncer сам управляет пулом к PostgreSQL
    max_overflow=0,
    connect_args={"options": "-c statement_timeout=30000"},
    execution_options={"no_parameters": True},  # отключить server-side params
)

Подводные камни

  • Превышение max_connections PostgreSQL: при горизонтальном масштабировании приложения (10 pods × pool_size=20 = 200 соединений) легко исчерпать лимит. Используйте PgBouncer или снижайте pool_size.
  • Забытый pool_recycle: AWS RDS, GCP Cloud SQL и большинство managed-БД закрывают idle-соединения через 8 часов. Без pool_recycle приложение «падает» после ночного простоя с OperationalError: SSL connection has been closed unexpectedly.
  • pool_timeout слишком большой: при pool_timeout=60 клиент получает HTTP 504 от nginx раньше, чем SQLAlchemy бросит TimeoutError. Устанавливайте pool_timeout < HTTP timeout.
  • Fork-safety: при preforked workers (gunicorn) Engine нужно создавать после форка, иначе несколько процессов делят одни сокеты. Используйте @app.before_serving или создавайте Engine в воркере.
  • LIFO vs FIFO: pool_use_lifo=True предпочитает недавно использованные соединения, которые скорее всего ещё «тёплые» (кеши PostgreSQL прогреты). Для высоконагруженных систем это даёт 5-15% прироста производительности.

Типичные ошибки

  • Описывать pool settings production только как термин и не показывать механизм на минимальном примере.
  • Игнорировать ошибки, пустые данные, конкурентный доступ или границы транзакции.
  • Не связывать поведение с официальным контрактом SQLAlchemy и реальной эксплуатацией.

Что проверяет интервьюер

  • Объясняет pool settings production через последовательность действий, а не через набор ключевых слов.
  • Приводит короткий кодовый пример или production-сценарий с ожидаемым поведением.
  • Называет хотя бы один риск: производительность, безопасность, транзакции, память или сопровождение.
  • Умеет обсудить отказ, наблюдаемость и rollback без изменения публичного контракта.

Как вы знаете этот вопрос?

Проверить себя по теме SQLAlchemy →

Источники

  • https://docs.sqlalchemy.org/en/20/core/engines.html
  • https://docs.sqlalchemy.org/en/20/core/pooling.html

Связанные темы

SQLAlchemydatabase-designproduction-architectureSecuritytechnical-reasoning

Вакансии с этим навыком

  • Python developer

Частые вопросы на собеседовании

  • Как решить проблему N+1 запросов в SQLAlchemy с помощью selectinload или joinedload?
  • Как работает Session в SQLAlchemy и что такое паттерн Unit of Work?
  • Как делать zero-downtime миграции с Alembic и SQLAlchemy models?
  • Что такое Engine в SQLAlchemy и как работает пул соединений?