Вопрос проверяет понимание необходимости таймаутов при выполнении внешних HTTP-вызовов или запросов к базам данных для обеспечения отказоустойчивости и стабильности приложения.
Внешние вызовы — это обращения вашего приложения к сторонним API, базам данных, микросервисам или любым другим сетевым ресурсам. Если такой вызов не имеет ограничения по времени выполнения (таймаута), он может ожидать ответа бесконечно долго в случае проблем у удалённой стороны.
Рассмотрим код на Node.js, который делает HTTP-запрос без таймаута и с таймаутом.
// ПЛОХО: Запрос без таймаута
const axios = require('axios');
async function fetchDataBad(url) {
try {
const response = await axios.get(url); // Может висеть минутами
return response.data;
} catch (error) {
console.error('Error:', error.message);
}
}
// ХОРОШО: Запрос с явным таймаутом
async function fetchDataGood(url) {
try {
const response = await axios.get(url, {
timeout: 5000 // Прервёт запрос через 5 секунд
});
return response.data;
} catch (error) {
if (error.code === 'ECONNABORTED') {
console.error('Request timed out');
// Здесь можно вернуть значение по умолчанию или бросить своё исключение
} else {
console.error('Other error:', error.message);
}
}
}Таймауты следует настраивать на разных уровнях:
Значения таймаутов зависят от SLA сервиса и требований к отзывчивости вашего приложения. Для пользовательских интерфейсов обычно используют значения от 1 до 10 секунд. Для фоновых задач они могут быть больше.
Вывод: Всегда устанавливайте разумные таймауты для внешних вызовов. Это критически важная практика для создания устойчивых (resilient) систем, которые могут изолировать сбои и продолжать работать, даже когда зависимые сервисы испытывают проблемы.