Skip to content

[TSK-59] 핀과목 크롤링 방식을 Grace Period으로 수정 #282

@2Jin1031

Description

@2Jin1031

문제 상황

탭 전환 등으로 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는 "마지막 활성 시각"을 갱신하는 역할만 담당

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions