피드로 돌아가기
Dev.toBackend
원문 읽기
singleflight 도입으로 gRPC 서버 부하 96% 감소 및 응답 속도 최적화
How I stopped 100 goroutines from hammering my gRPC server — Loom Part 2
AI 요약
Context
동일한 Method Descriptor를 요청하는 다수의 Goroutine이 동시에 발생하며 Backend에 중복 RPC 요청이 집중되는 Cache Stampede 현상 발생. 단순한 Mutex 기반 캐싱만으로는 동시 요청 시의 중복 호출을 막지 못해 레이턴시와 시스템 부하가 급증하는 구조적 한계 노출.
Technical Solution
- RLock을 활용한 Fast Path 설계로 캐시 적중 시 Lock 경합 최소화
- golang.org/x/sync/singleflight 도입을 통한 중복 요청의 단일화 처리
- 동일 키에 대한 여러 요청을 하나의 실행 단위로 묶어 단 한 번의 Backend 호출로 해결
- 호출 완료 후 결과를 대기하던 모든 Goroutine에 동일한 결과값을 배분하는 구조 채택
- defer와 수동 Lock/Unlock 혼용 시 발생하는 Deadlock 위험을 제거한 동기화 로직 구현
- Server Reflection을 이용한 gRPC 프레임 실시간 디코딩 및 투명한 프록시 계층 설계
실천 포인트
1. Cache Stampede 방지를 위해 singleflight 라이브러리 적용 검토
2. 읽기 작업이 많은 캐시 구조에서는 Mutex 대신 RWMutex의 RLock 우선 사용
3. Lock 범위 내에서 외부 API 호출 등 블로킹 작업 배제
4. -race 플래그를 활용한 동시성 버그 및 Deadlock 사전 검증