Ответ
В моей практике, когда я ставил задачу джуну на проекте по разработке микросервиса на Python, это выглядело так:
Контекст: "У нас в сервисе payment-processor есть проблема: при запросе истории платежей (GET /api/v1/payments) клиенты иногда получают таймаут, если у них очень много транзакций. Логи показывают, что проблема в медленном SQL-запросе к таблице payments."
Задача: "Необходимо оптимизировать endpoint /api/v1/payments. Критерий успеха — время ответа 95-го перцентиля (p95) должно быть ниже 500 мс при нагрузке в 100 RPS. Пользователи не должны замечать изменений в формате ответа."
Ожидаемый результат и шаги:
- Анализ: Проведи
EXPLAIN ANALYZEтекущего запроса, найди узкое место (скорее всего, отсутствие индекса илиSELECT *). - Решение: Предложи вариант оптимизации. Например:
- Добавить составной индекс
(user_id, created_at DESC). - Внедрить пагинацию с использованием
LIMIT/OFFSETили ключаcreated_at. - Рассмотреть возможность денормализации или кэширования.
- Добавить составной индекс
- Валидация: Напиши нагрузочный тест (с помощью Locust) для проверки, что p95 укладывается в 500 мс.
- Сроки и приоритет: Это задача среднего приоритета. Ожидаю, что анализ займет 1 день, реализация и тесты — еще 2. Готов обсудить твой план завтра утром."
Критерии приемки:
- Endpoint возвращает данные в том же JSON-формате.
- Пагинация реализована (если выберешь этот путь).
- Нагрузочный тест подтверждает достижение целевого p95.
- Код покрыт юнит-тестами, изменения в миграциях БД задокументированы.