Как да ограничите скоростта на API [затворено]

Кой е най-добрият начин за ограничаване на заявките за API? По принцип искаме да ограничим потребителите до 360 API заявки на час (заявка на всеки 10 секунди). Това, което идва на ум, е проследяване на всяка заявка за API и съхраняване:

  ip-address          hourly-requests
  1.2.3.4             77
  2.3.4.5             34
  3.4.5.6             124

Ако заявките за ip-адрес са по-големи от 360, просто върнете заглавка с:

  429 - Too Many Requests

След това върнете брояча на почасови заявки на всеки час. Това изглежда като много неефективен метод, тъй като трябва да направим MySQL заявка за всяка API заявка, за да увеличим брояча. Освен това ще ни е необходима cron задача за нулиране на всички броячи на всеки час.

Има ли по-елегантно/ефикасно решение?


person Justin    schedule 08.01.2012    source източник
comment
За по-еластичен подход може да искате да разгледате Алгоритъм за Token Bucket. Броячите трябва да се съхраняват в някакво хранилище на паметта за производителност.   -  person botchniaque    schedule 02.07.2015


Отговори (5)


Можете да опитате да използвате Redis, има няколко модела за ограничаване на скоростта

person Alehandro Sanchez    schedule 09.02.2013

Определено не бих препоръчал да правите това с MySQL - проблемът не е толкова много четене или неефективността на алгоритъма, който подчертавате там - а записите. С нарастването на обемите ще започнете да навлизате в многосекундни записи. Ние използваме REDIS като хранилище като друг вече споменат плакат - той има функции за атомарно увеличаване/намаляване, които са точно това, от което се нуждаете + той е изключително бърз (в паметта) - просто трябва да управлявате шардинга при ултра големи обеми (но това ултрависоко е много порядъци над MySQL). Друга опция, ако не сте запознати с REDIS, е работата в Memcached - но не е толкова добра на ниво операции.

Допълнителна опция все още е да използвате нещо като 3scale (http://www.3scale.net), което ефективно прави всичко това за вас + други неща (анализ, управление на ключове, документи за разработчици и т.н.). Има кодови плъгини за цял куп езици (https://support.3scale.net/libraries) и те се свързват с инфраструктурата. Можете също да използвате Varnish Libmod (https://github.com/3scale/libvmod-3scale/) и да го включите в Varnish кеш пред API.

person steve    schedule 03.06.2012

Опитайте nginx. Ограничаването на скоростта може да се направи лесно чрез записване на прости промени в конфигурационния файл. Освен това nginx е бърз.

person Kartik Goyal    schedule 11.02.2015

За идеална производителност можете да стартирате лека уеб рамка с функции за управление на регистрационни файлове на база данни в паметта за наблюдение и регистриране на данните за трафика, независимо дали въз основа на IP или Потребител или Услуга, извикана от потребител. По-важният избор е съхранението на данни, което искате да използвате.

Най-добрите и най-използваните безплатни опции са:

redis.io разширен магазин за ключ-стойност

ehcache базиран на стандарти кеш, активно разработен, поддържан и поддържан като професионален проект с отворен код от Теракота

hazelcast мрежа с данни в паметта с отворен код за по-бързо изпълнение и безпроблемна еластична скалируемост

VoltDB оперативна база данни в паметта

person kommradHomer    schedule 21.02.2014

В момента проучвам и този проблем. Настоящият ми план (забележете, че това е със стек LAMP!) е да внедря това с помощта на функциите за кеширане на APC. Когато се получи заявка, аз проверявам дали този IP е записан в кеша на APC. Ако е така, проверете дали е по-голямо от 'X', където 'X' е максималния брой заявки за единица време. Ако не е, тогава създайте запис в кеша за този IP.

Тази система означава, че не е необходим достъп до база данни за проверка на ограничаването на скоростта и не разчита на нищо подобно на MongoDB или Redis сървър. Предполага се, че използвате PHP с APC; ако не сте, тогава memcached може да работи вместо това.

person Mechcozmo    schedule 05.03.2012