предложения алгоритма ограничения скорости для данного сценария - PullRequest
2 голосов
/ 25 декабря 2011

Каков наилучший механизм для реализации нижеприведенных вариантов ограничения скорости.Можно использовать общие алгоритмы, такие как Token Bucket, но я хочу, чтобы реализация была в контексте memcached.Оцените помощь по этому вопросу.

  • разрешает только 100 вызовов от клиента ABC в день.
  • разрешает только 50 вызовов API для клиента ABC в час.разрешить только 5 вызовов API для клиента ABC для любого идентификатора пользователя в час.

Ответы [ 2 ]

0 голосов
/ 29 февраля 2012

Если я правильно понимаю, каждый запрос API идет с идентификатором пользователя и клиентом. Каждый клиент может иметь несколько идентификаторов пользователей. Вы хотите оценить ограничение как на уровне клиента, так и на уровне идентификатора пользователя.

Вам потребуется использовать несколько ключей ABC_day, ABC_hour, ABC_userID1_hour, ABC_userID2_hour и т. Д., Чтобы подсчитать, сколько раз эти действия выполнялись. Проблема с этим подходом заключается в том, когда нужно сбросить эти счетчики. Поскольку memcached поддерживает только оператор приращения для числовых значений, нам необходимо закодировать эту информацию в самом ключе. Мы можем использовать ABC_2012_02_28 в качестве ключа для ограничения дневной ставки. В вашем коде просто создайте ключ, используя текущую дату, и увеличивайте ее. Когда день изменится, ваш код будет искать ABC_2012_02_29, который не существует и дает вам возможность создать новый ключ.

Альтернатива кешированию. Это кеш, похожий на memcached и поддерживающий протокол memcached, и он предоставляет сценарии "в кеше". Вместо того, чтобы создавать так много ключей, вы можете реализовать свой собственный объект «ограничения скорости», который сделает всю эту бухгалтерию за вас. См. http://chakpak.blogspot.in/2011/09/rate-limitingquota-with-cacheismo.html для примера реализации ограничения скорости. Вы можете получить это отсюда. https://github.com/iamrohit/cacheismo.

0 голосов
/ 25 декабря 2011

Что вы хотите, чтобы по достижении этого предела? Вы можете запретить обслуживание или перенаправить на страницу возврата завтра, но это довольно уродливо.

Вы можете замедлить скорость обработки их запросов, но это более полезно для скоростей, составляющих несколько в секунду. например Клиент ABC ограничен до 100 в секунду или в минуту. Из-за очень низких тарифов, о которых вы говорите, клиент будет время ожидания и думать, что сервер не работает.

...