아래 내용들은 추후에 고도화 시, 수정 또는 논의가 필요한 내용들입니다. (현재는 반영되어있지 않습니다!)
1-1) 현재 설정
// TODO: 성능을 위해 엄격한 동기화 대신 soft limit 적용
// 동시 요청 시 소폭 초과 가능 - 멘토링 후 확인 예정
private void validateSubscriberLimit(Long auctionId) {
int current = streamSupport.getAuctionSubscribers(auctionId);
if (current >= MAX_SUBSCRIBERS_PER_AUCTION) {
log.warn("경매 {} 구독자 수 한도 초과 - 현재: {}", auctionId, current);
throw new CustomException(ErrorType.SERVICE_SUBSCRIBER_LIMIT_EXCEEDED);
}
}
1-2) 문제 상황
요청 A: 999명 확인 → 통과
요청 B: 999명 확인 → 통과 (거의 동시에)
요청 A: 구독 → 1000명
요청 B: 구독 → 1001명 ← 초과!
1-3) 원인
getAuctionSubscribers)과 등록(subscribe)이 atomic하지 않음1-4) 해결책
현재: Soft Limit 유지 (성능 우선)
| 장점 | 단점 |
|---|---|
| 락 없음, 빠름 | ±10명 오차 가능 |
| 구현 간단 | 정확한 제한 불가 |
적합한 경우: UX 목적의 느슨한 제한, 초과해도 서비스 영향 없음
필요 시: Hard Limit (정확성 우선)
// Support에서 atomic하게 처리
public synchronized SseEmitter subscribeWithLimit(Long auctionId, Integer currentPrice, int maxSubscribers) {
if (getAuctionSubscribers(auctionId) >= maxSubscribers) {
throw new CustomException(ErrorType.SERVICE_SUBSCRIBER_LIMIT_EXCEEDED);
}
return subscribe(auctionId, currentPrice);
}
적합한 경우: 과금 기반, 라이선스 제한, 리소스 한계
1-5) 결론