
❓ circuit breaker 랑 차이점?
- HTTP 를 예로 들면 이 장치는
특정 기간내에 전송되는클라이언트 요청 횟수를 제한함- API 요청 횟수가 제한 장치에 정의된 임계치를 넘어서면, 추가로 도달한 모든 호출은 처리가 중단됨
❓어떤 사례가 있을까?

❓ 마이크로서비스가 아닌 경우에는 보통 어디에 구현되는가?

토큰 공급률이 결국 처리량과 관련있는 지표이므로, 얘도 경계에 요청이 몰리는 문제는 해결 불가능
- 단순한 데이터 구조 : 버킷 크기와 현재 토큰 수만 관리하면 됨 (레디스)
- 누출 버킷 알고리즘과 달리 개별 요청을 큐에 저장할 필요 없어 메모리 사용 줄일 수 있음
단기간 집중되는 트래픽 처리 불가능한 알고리즘 == 누출 버킷 알고리즘
토큰 버킷 알고리즘은 초당 10만개의 토큰이 공급된다면
- 0.1초만에 10만 개의 요청이 와도 처리가능.
- 0.9초동안 온 5만개의 요청은 버려짐
하지만 누출 버킷 알고리즘 (요청 수용 가능한 큐 크기 :15만개 / 처리율 10만개라면) 은 0.1초만에 10만개의 요청이 올 경우 0.9초동안 온 나머지 5만개의 트래픽 요청은 큐에 담겨 있다가 1초뒤에 처리됨
버킷 크기 : 머신 러닝이나 예측 알고리즘을 사용하여 감지된 패턴에 따라 버킷 크기 동적 조절 필요
- Akamai의 2023년 연구에 따르면, 동적 토큰 버킷 크기 조정은 전자상거래 애플리케이션의 피크 트래픽 기간 동안 지연 시간을 15% 감소시켜 고객 만족도를 향상시켰다고 함
토큰 공급률 : 예상 평균 트래픽과 일치해야 함.
- 분당 100개의 요청이 예상되는 API는 분당 약 100개의 토큰을 허용하되, 약간 더 높은 버스트 허용치를 두어야 함
실제 적용 사례
- Twitter의 API 관리
- 도전 과제: Twitter는 개발자들에게 관대한 API 한도를 제공하면서도 남용을 방지해야 함
- 해결책: 토큰 버킷 알고리즘을 구현하여 높은 API 트래픽을 관리하고 조용한 시간대에는 버스트를 허용. 사용자 행동에 따라 버킷 크기를 동적으로 조정하여 공정성과 성능의 균형을 맞춤
- 결과: Twitter는 정당한 개발자들의 원활한 경험을 유지하면서 API 남용 사건을 40% 줄임
- Zoom의 대역폭 관리
- 도전 과제: Zoom은 팬데믹 기간 동안 대규모 트래픽 급증을 경험했고, 이는 인프라에 부담을 주었음
- 해결책: 토큰 버킷 메커니즘으로 비디오 스트리밍 대역폭을 제어하여 고해상도 스트림을 위한 짧은 버스트를 허용하면서 피크 사용 시간 동안 지속적인 트래픽을 제한
- 결과: Zoom은 고트래픽 기간 동안 서비스 중단을 최소화하고 대역폭 관련 불만을 25% 줄임

요청 처리율이 고정되어 있다 == 지정된 시간당 처리 가능한 양 (처리율) 이 고정되어 있어서 트래픽이 몰리더라도, 한번에 처리되지 않고 처리율에 따라 일정하게 출력된다

동작 원리
이 알고리즘의 가장 큰 문제는 윈도의 경계 부근에 순간적으로 많은 트래픽이 집중될 경우, 윈도에 할당된 양보다 더 많은 요청이 처리될 수 있다는 점이다.
장점
레디스를 활용해서 카운터 값만 저장하고 있으면 됨
❓어떤 트래픽 패턴?
단점

그러면 1:01:31 에 요청이 들어온 순간 1:00:50 요청, 1:01:31 의 요청이 둘다 시스템에 전달됨
1:01:42 에 새 요청이 들어오면 1:00:42 ~ 1:01:42 사이의 로그가 3이니까 1:01:42 도 요청 거부됨
즉, 이동 윈도 로깅 알고리즘은 호출 횟수를 제한한다 (=요청량을 제한 / 처리율 제한 x)
❓개선 가능한 방법은 없을까?

고정 윈도 카운터 알고리즘의
- 윈도 개념
- 카운터 사용
- 메모리 효율성
이동 윈도 로깅 알고리즘의
- 윈도 경계에서 발생할 수 있는 트래픽 문제 해결
- 이전 윈도 데이터 활용
- 거부된 요청 타임스탬프를 보관하는 이동 윈도 로깅 알고리즘보다 좋다
- 카운터를 사용하는 알고리즘 자체가 좋다 (고정 윈도 카운터 알고리즘에도 동일한 장점이 적혀 있음)
캐시가 바람직하다만료 정책을 지원하기 때문이다X-RateLimit-Remaining: 59 // 윈도 내에 남은 처리 가능 요청 수
X-RateLimit-Limit: 60 // 매 윈도마다 클라이언트가 전송할 수 있는 요청 수
X-RateLimit-Retry-After: 100 // 한도 제한에 걸리지 않으려면 몇 초 뒤에 요청을 다시 보내야 하는 지 알림


애플리케이션 계층에서의 처리율 제한에 대해서만 살펴보았지만 다른 계층에서도 처리율 제한이 가능하다.