Исключения ограничения скорости в промежуточном программном обеспечении Express?

В приложении Express.js мы хотели бы ограничить скорость пользователей, которые слишком часто переходят по определенному маршруту, но только в том случае, если они вызывают определенное исключение. Есть ли естественный способ сделать это в Express?

Вот примерно то, что у нас есть сейчас, без ограничений по скорости.

app.get(
    "/api/method", 
    authenticationMiddleware, 
    handler
);

Промежуточное ПО ограничителя скорости обычно выглядит так. Он считает обращения и ошибки, если пользователь обращался к нему слишком много раз, прежде чем мы дойдем до обработчика.

app.get(
    "/api/method", 
    authenticationMiddleware, 
    rateLimiterMiddleware,   # <--- count, and tell them to go away if over limit
    handler
);

Однако нас устраивает, что они обращаются к нему столько раз, сколько хотят - мы просто хотим заблокировать их, если они недавно вызвали множество исключений.

В Express предполагается, что обработчики ошибок находятся в конце цепочки обработчиков.

Таким образом, кажется, что мы должны поставить «охранник» впереди, а «счетчик» обработки ошибок - в конце.

app.get(
    "/api/method", 
    authenticationMiddleware, 
    errorIfTooManyExceptionsByUser,   # <--- tell them to go away if over the limit
    handler, 
    countExceptionsForUser            # <--- count
);

Это кажется неэлегантным, а также немного сложным, поскольку две части промежуточного программного обеспечения, ограничивающего скорость, должны много знать друг о друге. Есть ли способ лучше?

Возможно, мы могли бы поумничать и изменить обработчик (-ы), чтобы выполнять охрану и подсчет до и после их запуска?

app.get(
   "/api/method", 
   authenticationMiddleware,
   rateLimitErrors(handler)   # <-- ???
)

Я что-то упустил или есть лучший способ сделать это?


person NeilK    schedule 05.03.2019    source источник


Ответы (1)


Возможно, вы можете посмотреть, как express-redis-cache обрабатывает свое промежуточное программное обеспечение (https://github.com/rv-kip/express-redis-cache/blob/df4ed8e057a5b7d41d894e6e468f975aa62206f6/lib/ExpressRedisCache/L184.js#=). Они оборачивают send() метод выражения своей собственной логикой. Возможно, с этим у вас может быть только одно промежуточное ПО, но я думаю, что это не лучшее решение.

Предел экспресс-скорости

Существует промежуточное ПО, которое обрабатывает ограничение скорости в экспресс-https://www.npmjs.com/package/express-rate-limit.

Обработка Nginx

Express - это легкий фреймворк, в официальном документе они советуют поставить Nginx перед вашим экспресс-сервером для обработки серверных вещей.

(https://expressjs.com/en/advanced/best-practice-performance.html)

Используйте обратный прокси

Обратный прокси-сервер находится перед веб-приложением и выполняет вспомогательные операции с запросами, помимо направления запросов в приложение. Среди прочего, он может обрабатывать страницы ошибок, сжатие, кеширование, обслуживание файлов и балансировку нагрузки.

Передача задач, которые не требуют знания состояния приложения, обратному прокси-серверу, освобождает Express для выполнения специализированных задач приложения. По этой причине рекомендуется запускать Express за обратным прокси-сервером, таким как Nginx или HAProxy, в производственной среде.

А в nginx у вас есть система ограничения скорости: https://www.nginx.com/blog/rate-limiting-nginx/. Я не знаю, можете ли вы настроить это для своего конкретного случая использования, но я думаю, что это лучший способ справиться с ограничением скорости.

person spasfonx    schedule 05.03.2019