문제 상황
탭 전환 등으로 SSE 연결이 일시적으로 끊기는 순간, 크롤링 대상에서 제외되어 핀 알림이 누락됩니다.
원인 분석
배경 지식
onCompletion의 동작 방식
onCompletion은 브라우저 단에서 매우 자주 발생한다
- 탭만 바꿔도 반복적으로 일어남 → 잠깐 끊겼다가 재연결이 반복적으로 일어남
크롤링 대상 선정 방식
- 현재 크롤링 대상 = SSE 연결된 사용자의 핀 (
ExternalService#getPinSubjects 참고)
- → 핀을 고정한 사람 중 지금 SSE가 연결된 사람만 크롤링
크롤링 누락 메커니즘
T+0초: 사용자가 크롤에 핀 고정 (DB 저장), SSE 연결 활성화
T+5초: 탭 전환 또는 일시적 연결 끊김
→ onCompletion 호출
→ emitters에서 제거
T+10초: ExternalPreInvoker 실행 (크롤링 대상 선정)
→ sseEmitterStorage.getUserTokens() 호출
→ 해당 토큰이 emitters에 없음
→ 핀 크롤링 대상에서 제외
결과: 사용자는 핀을 고정했지만 크롤링이 안됨
해결 방향
onCompletion 발생 시 emitters에서 즉시 제거하지 않고, 일정 시간(Grace Period) 동안 크롤링 대상을 유지한다.
- SSE 연결 상태와 크롤링 대상 선정 로직을 분리
- SSE는 "마지막 활성 시각"을 갱신하는 역할만 담당
문제 상황
탭 전환 등으로 SSE 연결이 일시적으로 끊기는 순간, 크롤링 대상에서 제외되어 핀 알림이 누락됩니다.
원인 분석
배경 지식
onCompletion의 동작 방식
onCompletion은 브라우저 단에서 매우 자주 발생한다크롤링 대상 선정 방식
ExternalService#getPinSubjects참고)크롤링 누락 메커니즘
해결 방향
onCompletion발생 시 emitters에서 즉시 제거하지 않고, 일정 시간(Grace Period) 동안 크롤링 대상을 유지한다.