Какие ошибки можно выявить в Python коде, например лишние запросы или повторное открытие сессии
Что проверяют
Видите ли вы проблемы производительности, которые не ломают тесты, но всплывают под нагрузкой. Обычно дают кусок кода на ревью, а следом спрашивают, как найти такое в уже работающем сервисе.
Как отвечать
Что чаще всего ищут на таком ревью:
- N+1 в ORM: цикл по заказам, внутри
order.user.name, и на каждую итерацию отдельный запрос. В Django лечитсяselect_relatedдля внешних ключей иprefetch_relatedдля многие ко многим и обратных связей, в SQLAlchemyjoinedloadиselectinload; - запросы в цикле:
getпо одному id вместоfilter(id__in=ids),save()на каждую строку вместоbulk_create,commit()внутри цикла; - лишняя выборка:
len(queryset)тянет все строки, когда хватитcount(), наличие проверяют черезif qs:вместоexists(); - HTTP без сессии:
requests.getв цикле каждый раз открывает новое TCP- и TLS-соединение, аrequests.Sessionдержит пул и переиспользует их. В асинхронном коде так же сaiohttp.ClientSessionиhttpx.AsyncClient: их создают один раз на приложение; - engine в обработчике:
create_engineна каждый вызов создаёт новый пул. Engine один на процесс, сессия одна на запрос; - незакрытые сессии: без
with Session(engine) as session:соединения не возвращаются в пул, и сервис упирается в его лимит (по умолчанию 5 плюс 10 сверх); - нет таймаута: у
requestsего нет по умолчанию, зависший внешний сервис подвешивает воркер.
Как искать: django-debug-toolbar, echo=True в SQLAlchemy, лог медленных запросов в базе, APM. В тестах число запросов фиксируют через assertNumQueries в Django или фикстуру django_assert_num_queries из pytest-django, и регрессия N+1 ловится в CI.
Где спотыкаются
Сразу предлагают кэш в Redis. Кэш маскирует N+1, а не лечит его, и добавляет проблему инвалидации.
Путают сессию ORM с соединением. Сессия SQLAlchemy берёт соединение из пула на время транзакции, открывать её на каждый запрос нормально, ненормально каждый раз создавать engine.
Находят проблему, но не предлагают способ её закрепить. Тест на число запросов показывает, что вы думаете о регрессиях.