Jitter의 정의
Jitter는 재시도(Retry) 로직에서 대기 시간에 일부러 ‘무작위성’을 섞는 기법입니다. 보통 네트워크 요청이 실패하면 시스템은 일정 시간 대기 후 재시도하는 백오프(Backoff) 전략을 사용합니다. 대표적으로 지수 백오프(Exponential Backoff)는 실패할 때마다 대기 시간을 2배씩 늘리는 방식인데, 문제는 여러 클라이언트가 동시에 실패했을 때 모두 똑같은 시점에 재시도를 몰아서 시도한다는 점입니다. Jitter는 이 대기 시간에 랜덤 값을 더하거나 곱해서, 재시도 타이밍을 분산시키는 역할을 합니다.
동작 원리와 예시
예를 들어 서버 장애로 1000명의 클라이언트가 동시에 요청을 실패했다고 가정해봅시다. 모두 같은 백오프 공식을 쓴다면 1초 후, 2초 후, 4초 후… 정확히 같은 타이밍에 재시도가 몰리게 됩니다. 이는 마치 콘서트장에서 문이 열리자마자 모든 관객이 한 치의 오차도 없이 동시에 입구로 뛰어드는 상황과 같습니다. 서버 입장에서는 순간적으로 폭탄처럼 몰려드는 요청, 즉 ‘천둥 무리 현상(Thundering Herd)’을 겪게 되고 이는 서버를 다시 다운시키는 악순환으로 이어질 수 있습니다.
Jitter를 적용하면 대기 시간 계산식이 예를 들어 다음과 같이 바뀝니다.
- 기본 지수 백오프:
wait = base * 2^attempt - Full Jitter 적용:
wait = random(0, base * 2^attempt) - Equal Jitter 적용:
wait = (base * 2^attempt) / 2 + random(0, (base * 2^attempt) / 2)
이렇게 하면 같은 조건에서 실패한 클라이언트라도 실제 재시도 시점이 조금씩 어긋나게 되어, 요청이 시간축에 걸쳐 자연스럽게 흩어집니다.
실무에서 왜 쓰는지
AWS나 Google Cloud 같은 대형 클라우드 서비스의 SDK에는 기본적으로 Jitter가 포함된 재시도 로직이 내장되어 있습니다. 마이크로서비스 환경에서는 하나의 서비스 장애가 순간적으로 전파되면서 연쇄적인 재시도 폭주가 발생하기 쉬운데, Jitter 없이는 서버가 복구되려는 순간에 다시 요청 폭탄을 맞아 복구 자체가 지연되는 경우가 많습니다. 반면 Jitter를 적용하면 요청이 시간에 걸쳐 분산되므로 서버가 점진적으로 부하를 회복할 여유를 갖게 됩니다.
정리하면 Jitter는 ‘똑같은 실수를 똑같은 타이밍에 반복하지 않도록’ 만드는 안전장치입니다. 단순해 보이지만 대규모 분산 시스템의 안정성에 실질적으로 큰 영향을 주는 기법이라, 재시도 로직을 설계할 때는 백오프와 함께 반드시 고려해야 할 요소입니다.