Я придумал наивное решение для алгоритма ограничения скорости для сервера Node.js, и я считаю, что есть способ упростить его, но я пока не уверен, как это сделать.
Мы хотим ограничить запросы до 50 в секунду. Таким образом, если приходит новейший запрос, и время между самым новым запросом и запросом, отстоящим на 50 позиций, составляет менее одной секунды, мы должны отклонить новый запрос.
Наивным способом реализовать это было бы иметь простой массив, содержащий 50 меток времени. Каждый раз, когда приходит событие, мы присваиваем ему значение Date.now() / process.hrtime(). Затем мы смотрим значение временной метки 50-й (последней) временной метки в очереди и значение Date.now() нового запроса, и если разница в временных метках превышает 1 секунду, мы принимаем новый запрос и переносим его на «очередь» и удалить самую старую временную метку из очереди. Однако, если разница составляет менее 1 секунды, мы должны отклонить запрос, и мы не перемещаем его в очередь, и мы не удаляем самую старую временную метку.
Вот код, который у меня есть на сервере Express
var mostRecentRequestsTimestamps = [];
app.use(function(req,res,next){
if(req.baymaxSource && String(req.baymaxSource).toUpperCase() === 'XRE'){
var now = process.hrtime(); //nanoseconds
if(mostRecentRequestsTimestamps.length < 50){
mostRecentRequestsTimestamps.unshift(now);
next();
}
else{
var lastItem = mostRecentRequestsTimestamps.length -1;
if(now - mostRecentRequestsTimestamps[lastItem] < 1000){ // 1000 milliseconds = 1 second
res.status(503).json({error: 'Server overwhelmed by XRE events'});
}
else{
mostRecentRequestsTimestamps.pop();
mostRecentRequestsTimestamps.unshift(now);
next();
}
}
}
else{
next();
}
});
Как вы могли видеть, он блокирует события только в том случае, если они исходят из одного конкретного источника, поэтому он не должен ограничивать другие типы запросов. Для этой логики требуется структура данных из 50 временных меток, что по сути ничего не значит, но я хотел бы еще больше упростить это, если это возможно. У кого-нибудь есть идеи? спасибо