toobusy-buffer

Middleware для expressjs, которое предназначено для временного хранения запросов в случае, если CPU сервера загружено

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

Очень жаль, но пока нет :(