본문 바로가기

MY아이디어

[아이디어] 대기열 기능 만들기에 대해서

사용자가 갑자기 몰리는 기능, 특히 해당 기능이 무거운 경우 (외부 API연결, 스크래핑, 무거운 쿼리) 사용자의 기능 접근을 의도적으로 일정수준으로 제한을 해야하는 경우가 발생한다.

 

이런경우, 대기열 기능으로 해당 문제는 해결할수있다. 

대기열이란, RateLimiter를 구현하는것이라고 보면 될듯하다.

세마포어를 이용해서, 내가 기능에 접근할 최대 횟수를 정하고, 항상 그 횟수안에서 기능의 접근을 허용하고 거부하도록 만드는 구현이다.

(가게에 화장실이 x개있고, 사람들이 줄을 서서 화장실에 접근하는 개념 ㅋ)

 

가장 일반적인 방법은 Redis의 Zset을 활용하는 방법이 있다.

이 부분은 AI에이전트들에 물어보면 상세하게 알려줄것이라, 구현의 어려움은 없겠지만, 우리는 어떻게 운용을 해야하는가를 고민해야한다.

이 영역이 인간 개발자의 가장큰 역할이지 않을까? ㅋ

 

우선 대기열에 접근할수있는 횟수를 정하는게 가장중요하다.

과연 어느정도로 접근제한횟수를 정할것인가?!

 

1) 해당 기능의 평균 실행 시간을 측정해야한다.

2) 스레드풀과 디비풀 사이즈를 감안하여, 해당 기능의 실행횟수가 최적의 상태가 되도록 TPS를 산정한다.

3) TPS를 이용하여 대기열의 최대횟수를 정의한다.

4) 사용자가 대기해야하는 최대시간을 정한다.

 

여기서 4)번이 가장 중요하다.

예를 들어, 1초에 10명의 사용자가 해당 기능에 접근하게 설정을 해두었다고 가정한다면,

사용자의 대기시간을 2초만 대기시켜도 TPS가 20명, 3초만 대기시키면, TPS가 30명으로 늘어날수있다는 이야기가된다.

 

여기서 사용자가 불편함, 대기한다고 인지할수없는 짧은 시간은 어느정도인지를 선택하는게 가장중요하다.

해당 시간동안에는 대기열 정보 (xxx명중에 xx째 대기중 이런 정보)를 보여주지 않고, 해당 시간동안 대기하고 진행하게 하면 그짧은 시간으로 인해 TPS가 20명, 30명으로 늘릴수있는 효과를 볼수있다.

(사용자는 어? 좀 느리네 라고 인지하는 정도)

 

그리고 그 이후에는 대기열 정보를 보여주어, 사용자에게 명시적으로 지금 사용자가 많으니, 대기를 해야하고 몇번째 대기중이다라고 보여주는 프로세스로 구성을 하면 더 효율적인 대기열을 만들수있다고 생각한다.

 

사용자에게 조금 느리다는 인지정도의 작은 불편함을 주면서 시간을 확보하여 TPS를 늘리고, 대기열을 보여줌에 따른 사용자의 이탈(오래걸리네..라고 생각하는 사용자)을 막을수있다고 생각한다.

 

서비스를 개발 하는데는 공학적인 아이디어도 중요하지만, 인문학적인 아이디어도 정말 중요하다고 생각한다. 결국 인간이 해당 서비스를 사용하고, 거기서 감정과 감성을 느끼게 되기 때문이다.

 

대기열을 구현할 상황이 오면, 이런식으로 한번 만들어 봐야겠다.

 

*키포인트 : 사용자가 눈치채지못할 시간동안에는 대기열을 보여주지않고, 대기시킴으로써 TPS를 늘린다. 그 이후 대기열을 보여준다!!