안녕하세요! API 제공자로서 저는 한동안 이 분야에 참여해 왔으며 성공적인 API 서비스를 실행하는 데 있어 가장 중요한 측면 중 하나는 API 조절을 구현하는 것입니다. 이번 블로그 게시물에서는 API 조절을 효과적으로 구현하는 방법을 공유하겠습니다.
API 조절이란 무엇입니까?
먼저 API 조절이 무엇인지부터 살펴보겠습니다. API 조절은 클라이언트가 API에 액세스할 수 있는 속도를 제어하는 데 사용되는 기술입니다. 특정 시간 내에 클라이언트가 만들 수 있는 요청 수에 대한 제한을 설정합니다. 이는 남용을 방지하고 서버 리소스를 보호하며 모든 사용자의 공정한 사용을 보장하는 데 도움이 됩니다.
API 조절이 중요한 이유는 무엇입니까?
API 제한이 중요한 데에는 몇 가지 이유가 있습니다. 우선, 서비스 거부(DoS) 공격을 방지하는 데 도움이 됩니다. 악의적인 사용자는 서버에 과부하를 걸고 서비스를 중단시키기 위한 요청으로 API를 넘치게 만들려고 시도할 수 있습니다. 제한은 그들이 할 수 있는 요청 수를 제한하므로 그러한 공격을 수행하기가 더 어려워집니다.
둘째, 서버 리소스가 효율적으로 사용되도록 보장합니다. 동시에 과도한 요청을 하는 클라이언트가 많은 경우 서버가 과부하되어 응답 시간이 느려지거나 심지어 충돌이 발생할 수 있습니다. 요청을 조절하면 서버의 로드를 관리하고 API를 원활하게 실행할 수 있습니다.
마지막으로 모든 클라이언트 간의 공정한 사용을 장려합니다. 조절하지 않으면 일부 클라이언트가 API 리소스를 독점하여 다른 클라이언트의 성능이 저하될 수 있습니다. 조절은 모든 클라이언트가 사용 가능한 리소스를 공정하게 공유하도록 보장합니다.
API 조절을 구현하는 방법
1. 토큰 버킷 알고리즘
API 조절에 가장 널리 사용되는 알고리즘 중 하나는 토큰 버킷 알고리즘입니다. 작동 방식은 다음과 같습니다.
특정 수의 토큰을 담을 수 있는 버킷이 있다고 상상해 보세요. 각 토큰은 클라이언트가 만들 수 있는 요청을 나타냅니다. 정기적으로 새 토큰이 최대 용량까지 버킷에 추가됩니다. 클라이언트가 요청을 하면 버킷에서 토큰을 "사용"해야 합니다. 버킷에 토큰이 남아 있지 않으면 토큰을 사용할 수 있을 때까지 요청이 거부되거나 대기열에 추가됩니다.
다음은 토큰 버킷 알고리즘을 구현하는 의사 코드와 같은 간단한 Python입니다.


class TokenBucket: def __init__(self, 용량, rate): self.capacity = 용량 self.rate = rate self.tokens = 용량 self.last_update = time.time() def get_tokens(self): now = time.time() # 마지막 업데이트 이후 추가된 토큰 수를 계산합니다 new_tokens = (now - self.last_update) * self.rate self.tokens = min(self.capacity, self.tokens + new_tokens) self.last_update = 이제 self.tokens를 반환합니다. def 소비(self, tokens): if self.get_tokens() >= 토큰: self.tokens -= 토큰 return True return False
이 코드에서는용량버킷이 보유할 수 있는 최대 토큰 수입니다.비율초당 새 토큰이 버킷에 추가되는 속도입니다.
2. 고정 창 알고리즘
고정 창 알고리즘은 API 제한을 구현하는 또 다른 간단한 방법입니다. 이 알고리즘을 사용하면 시간을 고정된 간격(예: 매분 또는 매시간)으로 나눕니다. 각 간격마다 클라이언트의 요청 수를 추적합니다. 요청 수가 해당 간격 내에 미리 정의된 제한을 초과하면 후속 요청이 거부됩니다.
Python에서 이를 구현하는 방법은 다음과 같습니다.
import time class FixWindowThrottler: def __init__(self,limit, window): self.limit =limit self.window = window self.request_count = 0 self.window_start = time.time() def allowed_request(self): now = time.time() if now - self.window_start > self.window: # 창 재설정 self.request_count = 0 self.window_start = now if self.request_count < self.limit: self.request_count += 1 반환 True 반환 False
이 코드에서는한계클라이언트가 해당 시간 내에 요청할 수 있는 최대 요청 수입니다.창문시간 프레임.
3. 슬라이딩 윈도우 알고리즘
슬라이딩 윈도우 알고리즘은 고정 윈도우 알고리즘의 고급 버전입니다. 시간을 고정된 간격으로 나누는 대신 슬라이딩 창을 사용하여 요청을 추적합니다. 이는 창이 지속적으로 이동하며 최근 과거에 이루어진 요청을 고려한다는 것을 의미합니다.
슬라이딩 윈도우 알고리즘을 구현하려면 원형 버퍼와 같은 데이터 구조를 사용하여 각 요청의 타임스탬프를 저장할 수 있습니다. 그런 다음 슬라이딩 창 내의 요청 수가 한도를 초과하는지 확인합니다.
from collections import deque import time class SlidingWindowThrottler: def __init__(self,limit, window): self.limit =limit self.window = window self.request_timestamps = deque() defallow_request(self): now = time.time() # deque에서 오래된 요청을 제거 while self.request_timestamps and now - self.request_timestamps[0] > self.window: self.request_timestamps.popleft() if len(self.request_timestamps) < self.limit: self.request_timestamps.append(now) return True return False
API에서 조절 구현
알고리즘을 선택한 후에는 이를 API에 통합해야 합니다. 일반적인 단계는 다음과 같습니다.
1. 고객 식별
API에 요청하는 각 클라이언트를 식별할 수 있는 방법이 필요합니다. 이는 API 키, 사용자 ID 또는 기타 고유 식별자를 통해 이루어질 수 있습니다.
2. 스로틀 정보 저장
각 클라이언트의 요청 기록에 대한 정보를 저장해야 합니다. 이는 데이터베이스, 캐시(예: Redis) 또는 메모리 내 데이터 구조에 있을 수 있습니다. 예를 들어 토큰 버킷 알고리즘을 사용하는 경우 각 클라이언트가 버킷에 보유한 토큰 수를 저장해야 합니다.
3. 스로틀 한계 확인
요청을 처리하기 전에 클라이언트가 제한을 초과했는지 확인하세요. 그렇다면 적절한 오류 응답(예: 429 요청이 너무 많음 상태 코드)을 반환합니다. 그렇지 않은 경우 정상적으로 요청을 처리하고 이에 따라 스로틀 정보를 업데이트합니다.
실제 API 조절의 예 - World API
실제 사례를 살펴보겠습니다. 예를 들어 Twitter API에는 엄격한 제한 제한이 있습니다. 다양한 유형의 엔드포인트에는 다양한 비율 제한이 있습니다. 예를 들어 검색 API는 표준 사용자의 경우 15분당 450개의 요청으로 제한됩니다.
또 다른 예는 Google Maps API입니다. Google은 제한을 사용하여 지도 서비스 사용을 관리합니다. 서비스 유형과 사용 중인 요금제에 따라 다양한 계층의 사용 제한이 있습니다.
결론
API 제한을 구현하는 것은 모든 API 공급자에게 필수적입니다. 이는 남용으로부터 서비스를 보호하고, 서버 리소스를 관리하고, 모든 클라이언트 간의 공정한 사용을 보장하는 데 도움이 됩니다. 토큰 버킷 알고리즘, 고정 창 알고리즘, 슬라이딩 창 알고리즘 중 무엇을 선택하든 이를 API에 적절하게 통합해야 합니다.
제약 산업에 종사하고 있으며 다음과 같은 고품질 API를 찾고 있다면페노피브레이트丨CAS 49562-28-9,피나스테리드丨CAS 98319 - 26 - 7, 또는하이드로코르티손아세테이트丨CAS 50-03-3, 귀하께서 당사의 API 서비스에 관심이 있으시다면 귀하의 요구 사항에 대해 대화를 나누고 싶습니다. API 요구사항과 협력 방법에 대한 논의를 시작하려면 언제든지 저희에게 연락해 주세요.
참고자료
- 레이튼, F. 톰슨, 사티시 라오. "O(c log c) 병렬 시간으로 패킷 라우팅 및 작업 - 상점 스케줄링." ACM 저널(JACM) 40.2(1993): 261 - 289.
- 네이글, 존. "IP/TCP 인터네트워크의 혼잡 제어." ACM SIGCOMM 컴퓨터 커뮤니케이션 리뷰 14.5(1984): 11 - 17.
