분산 환경의 Websocket Rate Limiting
핵심 내용
분산 환경에서 Websocket의 동시 연결 수를 제한하기 위해 Redis와 키 갱신 메커니즘을 활용하는 방법을 설명한다.
자세히 보기
일반적인 HTTP API의 Rate Limiting은 요청 횟수를 제한하는 것이지만, Websocket은 지속적인 연결(persistent connection)을 유지하므로 접근 방식이 다르다. 특히 분산 환경에서는 각 서버가 상태를 공유해야 하므로 Redis를 활용하는 것이 일반적이다.
Replit의 사례처럼 동시 연결(concurrent connections) 수를 제한해야 할 경우, 각 서버가 사용자별 연결 수를 Redis에 기록하고 이를 합산하여 검증하는 방식을 사용할 수 있다. 서버는 고유 ID를 기반으로 customer-limit-{userId}:{serverUid} 형태의 키를 생성하고, 연결 시 증가, 해제 시 감소시킨다.
하지만 이 방식에는 치명적인 결함이 있다. 서버가 예기치 않게 종료되거나 네트워크 장애가 발생할 경우, 연결 해제(decrement) 작업이 수행되지 않아 Redis에 '좀비(zombie)' 연결 데이터가 남게 된다.
이를 해결하기 위해 Redis의 EXPIRE 기능을 활용한다. 각 키에 만료 시간을 설정하되, 연결이 유지되는 동안에는 백그라운드에서 주기적으로 키를 갱신하는 refresher 프로세스(예: Go의 goroutine)를 운영하여 데이터의 유효성을 지속적으로 관리한다.
이 한국어 요약은 AI가 자동으로 만들었습니다. 원문의 주장과 맥락은 원문에서 확인해 주세요. 저작권은 원저작자에게 있습니다.