TPS 조절하기

Woody·2025년 7월 6일

TIL

목록 보기
19/19

문제

현재 우리의 서비스의 TPS가 500이라고 해도 타 서비스의 TPS가 200이라면 결국 우리의 TPS는 200이 된다.

이렇게 서비스 간에 TPS의 차이가 발생할 때 어떻게 대처해야 할까?

해결

상대 서비스의 TPS에 맞춰서 우리의 TPS를 조절해서 타 서비스에 요청을 보내야 한다. 즉, 상대 측으로 가는 요청을 제한해서 보내야 한다.

TPS를 조절하지 않는다면 타 서비스에 부하가 발생해 응답 시간은 계속 지연되면서 장애가 발생할 것이고,
해당 서비스를 사용하는 우리 서비스에도 장애가 전파되기 때문이다.

이러한 현상을 방지하기 위한 대표적인 처리율 제한 방식으로 Bulk Head 방식과 Rate Limiter 방식이 있다.

Bulk Head

  • 리소스에 동시에 접근할 수 있는 요청 수를 제한하는 것이 주 목표이다.
  • 스레드 풀 또는 세마포어를 통해 접근할 수 있는 요청들을 제한한다.
  • 제한한 요청 값 이내의 요청이 들어오면 병렬로 요청들을 처리한다.
  • 설정한 요청 수를 초과하는 경우, 일정 시간 동안 대기했다가 fallback함수로 처리한다.
  • ex) DB 커넥션 풀 보호 : 동시에 최대 10개의 연결만 허용

Rate Limiter

  • 일정 시간 동안 리소스에 접근할 수 있는 요청 수를 제한하는 것이 주 목표이다.
  • 처리율 제한 알고리즘의 대표적인 방식으로 token bucket, sliding window counter 등이 있다.
  • 설정한 요청 수를 초과하는 경우, 일정 시간 동안 대기했다가 fallback함수로 처리한다.
  • ex) 하루에 최대 10,000번 요청까지 무료 , 1분에 최대 1,000번 요청 가능

정리

그렇다면 각 서비스 간의 TPS간 차이가 발생한다면 어떤 방식을 사용해야할까? 우선 TPS란 초당 처리할 수 있는 트랜잭션 수이기 때문에 이것은 일정 기간에 해당한다. 따라서 Rate Limiter를 통해서 처리율을 제한하자.

그렇다면 1초당 200개의 요청을 처리하도록 설정하는 것도 좋지만, 아래 사항들을 추가로 고려하면 더 좋다.

1. 해당 서비스를 사용하는 서비스들은 얼마나 있을까?

만약 또 다른 서비스에서도 동시에 200개를 제한한다면 해당 서비스는 1초에 400개의 요청을 처리해야 하기 때문에 본인의 TPS를 초과한다.

그렇기 때문에 해당 서비스를 사용하는 또 다른 서비스들과 TPS 비율을 조율해서 200개 보다 적은 수를 설정하는 것이 안전하다.

2. 동시에 처리할 수 있는 처리량은 어떻게 될까?

1초당 200개를 처리할 수 있다고 해서 동시에 200개를 한번에 요청하면 위험할 수 있다.

따라서 Bulk Head도 추가로 적용해서 동시에 요청할 수 있는 수를 제한하는 것이 안전하다.

0개의 댓글