피드로 돌아가기
One SSE connection, N upstream agents — the stream relay we shipped
Dev.toDev.to
Backend

Redis Streams 기반 Relay 설계로 Pod 교체 중에도 끊김 없는 N:M SSE 스트리밍 구현

One SSE connection, N upstream agents — the stream relay we shipped

Takayuki Kawazoe2026년 5월 1일18advanced

Context

에이전트 Pod의 배포 및 회전 시 클라이언트 SSE 연결이 유지되나 실제 이벤트 수신이 중단되는 좀비 연결 문제 발생. 단순 Proxy 구조는 클라이언트 수만큼 Upstream 연결이 증가하며, Last-Event-ID 미지원 시 재연결 과정에서 데이터 유실이 불가피한 한계 존재.

Technical Solution

  • Upstream 연결과 클라이언트 제공 경로를 분리하여 Single Source of Truth 확보
  • Redis Distributed Lock을 통한 Run 단위의 Stateless Relay 소유권 제어 구조 설계
  • Redis Streams를 Durable Buffer로 활용하여 최대 10k 개의 이벤트 보존 및 Reconnect 시 재전송 보장
  • DB Scan 기반의 소유권 갱신 루프를 통해 Relay Pod 장애 시 타 인스턴스가 즉시 Tailer 작업을 승계하는 Failover 메커니즘 구현
  • FastAPI sse-starlette를 통한 다수 클라이언트의 동시 읽기 구조로 Upstream 부하 최소화

- SSE Relay 설계 시 Upstream-Tailing 경로를 개별 클라이언트 세션과 완전히 독립시킬 것 - Pod Rotation이나 네트워크 단절에 대비해 Redis Streams와 같은 중간 버퍼 계층 도입 검토 - 분산 환경의 Tailer 중복 실행 방지를 위해 Redis 기반의 Leased Ownership 모델 적용 - 클라이언트 재연결 시 유실 방지를 위해 Last-Event-ID 기반의 Stream Seek 로직 구현 권장

원문 읽기