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-address 요청이 360보다 크면 다음과 함께 헤더를 반환하면됩니다.
429 - Too Many Requests
그런 다음 카운터 시간별 요청을 매시간 롤백합니다. 카운터를 증가시키기 위해 모든 API 요청에 대해 MySQL 쿼리를 만들어야하기 때문에 이것은 매우 비효율적 인 방법처럼 보입니다. 또한 매시간 모든 카운터를 재설정하려면 cron 작업이 필요합니다.
더 우아하고 효율적인 솔루션이 있습니까?
Redis를 사용해 볼 수 있지만 속도 제한에 대한 패턴이 거의 없습니다.
나는 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 캐시에 연결할 수도 있습니다.
nginx를 사용해보십시오. 구성 파일에 간단한 변경 사항을 작성하여 속도 제한을 쉽게 수행 할 수 있습니다. 또한 nginx는 빠릅니다.
이상적인 성능을 위해 트래픽 데이터를 모니터링하고 로깅하기 위해 인 메모리 데이터베이스에서 로그를 관리하는 기능이있는 경량 웹 프레임 워크를 실행할 수 있습니다 . IP 기반 이거나 사용자 또는 사용자가 호출 한 서비스를 기반으로 합니다 . 더 중요한 선택은 사용하려는 데이터 저장소입니다.
가장 많이 사용되는 무료 옵션은 다음과 같습니다.
redis.io 고급 키-값 저장소
ehcache 표준 기반 캐시, Terracotta에서 전문 오픈 소스 프로젝트로 적극적으로 개발, 유지 관리 및 지원
빠른 실행과 원활한 탄력적 확장 성을 위해 오픈 소스 인 메모리 데이터 그리드를 hazelcast
VoltDB 인 메모리 운영 데이터베이스
현재이 문제도 조사 중입니다. 나의 현재 계획 (이것은 LAMP 스택과 함께 있습니다!)은 APC의 캐시 기능을 사용하여 이것을 구현하는 것입니다. 요청을 받으면 해당 IP가 APC의 캐시에 저장되어 있는지 확인합니다. 그렇다면 'X'보다 큰지 확인하십시오. 여기서 'X'는 단위 시간당 최대 요청입니다. 그렇지 않은 경우 해당 IP에 대한 캐시 항목을 만듭니다.
이 시스템은 속도 제한을 확인하기 위해 데이터베이스 액세스가 필요하지 않으며 MongoDB 또는 Redis 서버와 같은 것에 의존하지 않음을 의미합니다. APC와 함께 PHP를 사용하고 있다고 가정합니다. 그렇지 않은 경우 memcached가 대신 작동 할 수 있습니다.
참조 URL : https://stackoverflow.com/questions/8775079/how-to-rate-limit-an-api
'Program Tip' 카테고리의 다른 글
Django : Jinja2로 전환 하시겠습니까? (0) | 2021.01.08 |
---|---|
x + = y는 컴파일 오류를 제공하고 x = x + y는 제공하지 않도록 x와 y를 어떻게 선언합니까? (0) | 2021.01.08 |
성능을 향상 시키려면 어떤 PHP opcode cacher를 사용해야합니까? (0) | 2020.12.27 |
이 이미지 처리 테스트에서 Swift가 C보다 100 배 느린 이유는 무엇입니까? (0) | 2020.12.27 |
PHP를 사용하여 웹 사이트에서 OCR을 구현하려면 어떻게해야합니까? (0) | 2020.12.27 |