Распределенное ограничение скорости

У меня есть несколько серверов/рабочих, которые проходят через очередь задач, выполняя запросы API. (Django с Memcached и Celery для очереди) Запросы API ограничены 10 запросами в секунду. Как я могу ограничить скорость, чтобы общее количество запросов (всех серверов) не превышало лимит?

Я просмотрел некоторые из связанных вопросов об ограничении скорости, я предполагаю, что они ориентированы на более линейный, непараллельный сценарий. Какой подход я должен использовать?


person RS7    schedule 17.12.2012    source источник


Ответы (3)


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

Конечно, он не будет рассчитывать ограничение скорости для нескольких узлов в распределенной среде, но то, что вы можете сделать, это настроить ограничение скорости динамически на основе количества работающих узлов (т.е. для 5 узлов у вас будет ограничение скорости 2 запроса API Второй)

person Petro Semeniuk    schedule 17.12.2012

Я работаю над проектом с открытым исходным кодом, чтобы решить именно эту проблему под названием Limitd. Хотя у меня пока нет клиентов для других технологий, кроме node, протокол и идея просты.

Ваш отзыв очень приветствуется.

person José F. Romaniello    schedule 19.04.2015

Я решил эту проблему, к сожалению, не для вашей технологии: bandwidth-throttle/token-bucket

Если вы хотите реализовать это, вот идея реализации:

Это алгоритм корзины маркеров, который преобразует содержащие токены в метку времени с момента, когда он в последний раз был полностью пуст. Каждое потребление обновляет эту метку времени (заблокировано), чтобы каждый процесс имел одно и то же состояние.

person Markus Malkusch    schedule 04.05.2016