Код Senior Ошибки и логирование спрашивают часто обновлено
Graceful shutdown: дождаться запросов в работе
Условие
Напиши createLifecycle({ timeoutMs }), который моделирует корректную остановку сервера. Вернуть объект:
handle(fn): если сервер принимает запросы, выполняет асинхроннуюfnи возвращает её промис, учитывая запрос как «в работе»; если уже идёт остановка, отклоняет промис ошибкой сstatus = 503иfnне вызывает;inFlight: число запросов в работе;shutdown(cleanup): перестаёт принимать новые запросы, ждёт завершения всех текущих (упавшие тоже считаются завершёнными), затем вызывает асинхроннуюcleanup()(закрыть пул БД) и выполняется со строкой'clean'. Если запросы не завершились заtimeoutMs, вызываетcleanup()и выполняется со строкой'timeout'. Повторныйshutdownвозвращает тот же промис.
Что проверяют тесты
ждёт запросы в работе
новые запросы после shutdown: 503
таймаут
упавший запрос тоже завершает работу
без запросов: сразу clean
повторный shutdown тот же промис
Как подойти
Подсказки: 2
- Счётчик запросов в работе уменьшай в
finally. - Остановка: гонка «все запросы завершились» против таймера.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.
Предыдущий вопрос
Цепочка причин ошибки (error.cause)
Следующий вопрос
Структурный лог с маскированием секретов