WORK IN PROGRESS
TOOBUSY BUFFER
Middleware для expressjs, которое предназначено для временного хранения запросов в случае, если CPU сервера загружено. (для определения этого факта используется модуль toobusy).
Принцип работы
Для сохранения запросов используется конструкция Circular buffer (Кольцевой буфер).
В данном случае она используется следующим образом.
Имеется массив постоянного размера, который хранит запросы. Имеется 2 индекса, которые указывают на входные и выходные элементы массива.
При вызове данного мидлваре происходит проверка toobusy()
.
Если она показывает, что сервер не загружен, то запрос отправляется дальше.
В противном случае, пытаемся добавить запрос в кольцевой буффер.
Если текущее количество запросов в очереди достигло максимального, то отдаем пользователю 503 ошибку, иначе добавляем запрос.
Раз в определенное количество милисекунд происходит проверка факта, что сервер не загружен, с помощью того же самого модуля (toobusy). Если это так, то часть запросов проходит дальше, иначе ждем следующего шанса передать запрос дальше по цепочке мидлвар.
Если время жизни запроса в очереди истекает, то смысла обрабатывать его уже нет - клиент все равно уже выкинул ошибку на таймаут. В этом случае в очередной проверке, смотрим на время жизни последнего добавленного запроса из выбранного набора. Он будет самым "молодым" - остальные старше него и, если он "протух", то остальные, также "протухли". Поэтому если время жизни последнего добавленного запроса больше максимального, то для всех запросов возвращаем 503.
В этом есть особенность работы данного модуля - время жизни запроса в редких случаях может быть значительно выше, чем установленное. С другой стороны, проверка времени жизни всего одного запроса из набора, избавляет от работы сомнительной нужности.
Использование
Имеет смысл добавить данную мидлвару одной из первых в цепочке, сразу после логирования запроса (и, возможно, других специфичных вещей).
var toobusyBuffer = require('toobusy-buffer');
toobusyBuffer.startScheduler();
app.use(toobusyBuffer.establish);
Тестирование
// todo
Очень жаль, но пока нет :(