Я изучаю разработку алгоритма ограничения масштабируемой скорости с использованием алгоритма скользящего окна. Я хочу сделать ограничение скорости отказоустойчивым, а также распределенным (масштабируемым).
Один из подходов заключается в том, что каждый сервер может иметь локальный счетчик, который будет периодически сбрасываться в постоянное хранилище, как указано в https://konghq.com/blog/how-to-design-a-scalable-rate-limiting-algorithm/ - (Оптимизация для повышения производительности).
скажем, у каждого узла есть локальный кеш, который будет периодически сбрасываться в постоянное хранилище по вашему выбору.
Как будут точными результаты общего числа запросов / интервалов?
Ex: Let's say we allow 15 requests in 10 minutes and flushing interval is about every 2 minutes.
Server1 saw 5 requests for userA from 1-3 minutes.
Server2 saw 4 requests for userA from 3-5 minutes.
.. All these will be flushed to persistent store at max by 7th min.
Server1 saw 7 requests from userA between 8-10 minutes. -(A)
Server2 saw 3 requests from userA between 8-10 minutes. -(B)
in (A) scenario, Server1 will be seeing total of 5+4+7=16 requests in total. So, last request will be rejected since it exceeds limit.
in (B) scenario, Server2 will be seeing total of 5+4+3=12 requests.
This is because server1's local count of 7 wasn't flushed to persistent-store yet.
Итак, мой вопрос о том, как алгоритм ограничения скорости может быть точным, делая его отказоустойчивым и масштабируемым? Любые предложения для решения этой проблемы? Цените любые входные данные.