Если endpoint работает 30 секунд, какие действия предпримешь
Python
Senior
Без компании
Если endpoint работает 30 секунд, какие действия предпримешь
Ответы
Для начала, разберу возможные причины и решения:
- **Оптимизация запроса**
Проверю, нет ли N+1 проблем, сложных JOIN'ов или отсутствия индексов в БД. Пример с индексом:
```
# До
User.query.filter(User.name == 'John').all()
# После добавления индекса
index = Index('idx_user_name', User.name)
```
- **Кеширование**
Добавлю кеш для тяжелых запросов через Redis:
```
from flask_caching import Cache
cache = Cache(config={'CACHE_TYPE': 'Redis'})
@cache.cached(timeout=60)
def slow_endpoint():
# heavy processing
```
- **Асинхронность**
Переведу на async/await если есть IO-bound операции:
```
@app.route('/data')
async def get_data():
result = await db.fetch('SELECT * FROM large_table')
return jsonify(result)
```
- **Фоновые задачи**
Для CPU-bound задач вынесу в Celery:
```
@celery.task
def process_data(data):
# heavy computation
@app.route('/process')
def start_process():
process_data.delay(request.json)
return {'status': 'started'}
```
- **Пагинация**
Разобью ответ на чанки:
```
@app.route('/items')
def get_items():
page = request.args.get('page', 1, type=int)
per_page = 50
pagination = Item.query.paginate(page, per_page)
return jsonify({
'items': [item.to_dict() for item in pagination.items],
'total': pagination.total
})
```
- **Профилирование**
Использую cProfile или line_profiler для поиска узких мест.
- **Лимитирование**
Добавлю rate limiting для защиты от злоупотреблений.
Выбор решения зависит от конкретного случая - сначала нужно определить bottleneck через мониторинг и профилирование.