2012-01-08 2 views
45

API 요청을 제한하는 가장 좋은 방법은 무엇입니까? 기본적으로 사용자는 한 시간에 360 회의 API 요청을 할 수 있습니다 (10 초마다 요청). 무엇을 마음에 오는 것은 모든 API 요청을 추적하고 저장한다 : 다음 시간마다-요청을 카운터를 롤백API의 속도를 제한하는 방법

429 - Too Many Requests 

다음 IP 주소 요청 (360)보다 큰

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

경우, 단지와 헤더를 반환 매시간. 카운터를 증가시키기위한 모든 API 요청에 대한 MySQL 쿼리를 작성해야하므로 매우 비효율적 인 방법 인 것 같습니다. 또한 매 시간마다 모든 카운터를 재설정하는 cron 작업이 필요합니다.

더 우아하고 효율적인 솔루션이 있습니까?

+0

더욱 탄력적 인 접근 방법으로 [Token Bucket Algorithm] (https://en.wikipedia.org/wiki/Token_bucket)을 살펴볼 수 있습니다. 카운터는 성능을 위해 일부 메모리 저장소에 보관해야합니다. – botchniaque

답변

2

현재이 문제도 조사 중입니다. 내 현재 계획 (이것은 LAMP 스택과 함께 있습니다!)은 APC의 캐시 기능을 사용하여이를 구현하는 것입니다. 요청이 수신되면 해당 IP가 APC의 캐시에 저장되어 있는지 확인합니다. 그렇다면 'X'보다 큰지 확인하십시오. 여기서 'X'는 단위 시간당 최대 요청입니다. 그렇지 않으면 해당 IP에 대한 캐시 항목을 작성하십시오.

이 시스템은 속도 제한을 검사하는 데 데이터베이스 액세스가 필요하지 않으며 MongoDB 또는 Redis 서버와 같은 것에 의존하지 않는다는 것을 의미합니다. PHP를 APC와 함께 사용하고 있다고 가정합니다. 그렇지 않다면 memcached가 대신 작동 할 수도 있습니다.

10

MySQL에서이 작업을 수행하는 것을 권장하지 않습니다. 문제는별로 읽지 않거나 거기에서 강조 표시하는 알고리즘의 비효율입니다. 볼륨이 올라감에 따라 멀티 초의 쓰기가 시작됩니다. 우리는 REDIS를 이미 언급 한 또 다른 포스터와 같은 저장소로 사용합니다. 그것은 원자 단위의 증분/감소 기능을 가지고 있으며, 사용자가 필요로하는 것보다 훨씬 빠르고 (메모리에서) 매우 빠릅니다 - 초고속 볼륨에서 샤딩을 관리해야합니다 MySQL보다 위의 많은 주문). REDIS에 익숙하지 않은 경우 Memcached에서 수행하는 또 다른 옵션이 있지만 작업 수준에서는 그리 좋지 않습니다.

추가 옵션은 여전히 ​​3scale (http://www.3scale.net)과 같은 것을 사용하여 다른 모든 것들 (분석, 키 관리, 개발자 문서 등)을 효과적으로 처리합니다. 전체 언어 (https://support.3scale.net/libraries)에 대한 코드 플러그인이 있으며 인프라에 연결됩니다. Varnish Libmod (https://github.com/3scale/libvmod-3scale/)를 사용하여 API 앞의 Varnish 캐시에 연결할 수도 있습니다.

4

성능의 이상적인 양의 경우는 트래픽 데이터를 모니터링을위한 in-memory database에 로그를 관리하고 로깅 기능을 가진 경량 웹 프레임 워크를 실행할 수 있습니다, 그것을 할 수 을 기반으로 IP 또는 사용자 또는 이라는 서비스가 있습니다. 더 중요한 선택은 당신이 고용하고자하는 데이터 스토리지입니다.

제일과 가장 많이 사용되는 무료 옵션은 다음과 같습니다

redis.io 고급 키 - 값 저장소

ehcache 표준 기반 캐시, 적극적으로 개발, 유지 및

테라코타

에 의해 전문 오픈 소스 프로젝트로 지원 hazelcast 오픈 소스 인 메모리 데이터 그리드로 신속한 실행 및 끊김없는 탄력적 인 확장 성 제공

VoltDB 메모리 내 op erational 데이터베이스

8

시도 nginx. 구성 파일에 간단한 변경 사항을 작성하여 속도 제한을 쉽게 수행 할 수 있습니다. 또한, nginx는 빠릅니다.