피드로 돌아가기
The Wrong GUID: How a Single Constant Broke WebSocket in Every Browser But Not Python
Dev.toDev.to
Backend

WebSocket Multiplexing을 통한 브라우저 HTTP/1.1 연결 제한 해결

The Wrong GUID: How a Single Constant Broke WebSocket in Every Browser But Not Python

Kunal Jaiswal2026년 4월 12일8advanced

Context

HTTP/1.1의 Origin당 동시 연결 수 제한(약 6개)으로 인해 다수의 MJPEG 스트림 로드 시 일부 카메라 화면이 출력되지 않는 병목 발생. 각 스트림이 연결을 점유하는 Long-lived HTTP 응답 구조로 인해 추가 연결이 불가능한 상태.

Technical Solution

  • 단일 WebSocket 연결 내 다수 스트림을 전송하는 Multiplexing 구조 설계
  • StreamManager를 통한 ffmpeg 프로세스 풀 관리로 클라이언트 수와 무관하게 카메라당 1개의 프로세스만 유지
  • Binary WebSocket Frame 형식을 정의하여 [카메라 ID 길이(1byte) + ID + JPEG 데이터] 구조로 데이터 전송
  • Python stdlib만을 이용한 RFC 6455 프로토콜 직접 구현으로 외부 의존성 제거
  • 클라이언트 측에서 수신한 Binary 데이터를 Blob URL로 변환하여 요소에 렌더링하는 최적화 적용
  • 구독 해제 시 10초의 Grace Period를 두어 페이지 새로고침 시 ffmpeg 프로세스의 불필요한 재시작 방지

1. 브라우저의 HTTP/

1.1 동시 연결 제한을 고려하여 다수 리소스 스트리밍 시 WebSocket 또는 HTTP/2 도입 검토

2. 프로토콜 직접 구현 시 RFC 표준 명세의 상수를 메모리가 아닌 원문에서 정확히 복사하여 적용

3. Python 클라이언트 성공이 브라우저 동작을 보장하지 않으므로 초기 단계부터 실제 대상 브라우저로 검증 수행

4. 프로세스 리소스 낭비를 막기 위해 Shared Process Pool과 Grace Period 전략 도입

원문 읽기