2012-11-07 2 views
9

최근에 서버에서 푸시를 수행 할 때 웹 소켓에 대한 훨씬 간단한 대안으로 서버 보낸 이벤트를 발견했습니다. 그들과 비교하는 대부분의 장소 (예 : here, herehere)는 클라이언트와 서버간에 전이중 통신이 필요하지 않으면 WebSockets가 과도하고 SSE가 충분하다고 말합니다.WebSockets 대신 양방향 클라이언트 - 서버 통신을 위해 Server-Sent 이벤트를 사용하는 단점

내 질문은 양방향 통신 (예 : 채팅)이 필요하고 클라이언트로부터 메시지를 보내기위한 정규 Ajax 요청과 메시지 스트림을 수신하기 위해 서버 스트림을 사용할 때 SSE 사용의 단점이 무엇입니까? SSE를 사용하기 위해 서버 측에서 구성을 거의하지 않아도된다는 점을 감안할 때 훨씬 매력적인 옵션 인 것으로 보입니다.

답변

14

SSE 장점 WebSocket을 이상 : 필요

  • 특별한 웹 서버 또는 웹 프록시 변경됩니다.

SSE 단점가 WebSocket을 비교하여 사용자 정의 이벤트 (그렇지 않으면, 클라이언트 API는 기본적으로 동일) 기존의 인증 메커니즘의

  • 쉽게 통합 (OAuth를, 오픈 ID 등) 정의 :

    • 단방향 통신 채널 (서버에서 클라이언트로). 서버 간 클라이언트에는 별도의 채널이 필요합니다.
    • SSE
    • 없음 기본 지원 (WebSocket을보다 XSS 공격에 가능성이 더 취약) 출처를 확인하기 위해 클라이언트에 의존 WebSockets :
    • 브라우저 지원이 제한적이다 (WebSocket을 반면 네이티브 IE 지원은 IE 10에서 지원되지 않습니다) (WebSocket은 ArrayBuffer와 Blob을 사용하여 Raw 프레임을 지원합니다.)
    • 이 (독립형 웹 소켓 서버가 매우 간단 할 수있다)에 SSE 엔드 포인트는 정적 웹 콘텐츠를 제공하지 않는 경우에도 전체 깃털 웹 서버를 필요
    • 양방향 통신을위한 AJAX와
    • SSE가 훨씬 높은 왕복 대기 시간이있을 것이다 및 WebSocket 연결을 사용하는 것보다 높은 클라이언트 -> 서버 대역폭. 이는 모든 클라이언트 -> 서버 AJAX 요청에 대한 연결 설정의 오버 헤드 때문입니다. 또한 서버 -> 클라이언트 대기 시간은 많은 구성에서 장시간 연결이 결국 닫히고 (종종 30 초마다) 다시 열어야 서버 -> 클라이언트 대기 시간이 일시적으로 상승하기 때문에 SSE에서 급증 할 수 있습니다 .

    참고 : 양방향 통신을

  • +2

    좋은 지적이지만 독립형 서버의 복잡성에 대해서는 동의하지 않습니다. SSE 프로토콜은 간단합니다. WebSockets (핸드 셰이크, 프레이밍, 마스킹, 바이너리)보다 훨씬 간단합니다. 두 경우 모두 HTTP 헤더와 같은 헤더를 구문 분석해야합니다. bash 스크립트로 SSE 서버를 구현할 수 있습니다 :) – Kornel

    +0

    @porneL, 맞습니다. 기본 SSE 서버는 구현하기가 상당히 간단 할 수 있지만 (bash 버전을보고 싶습니다) 기본 WebSocket 서버도 있습니다. 그러나 관계없이, 내 요점은 WebSocket 서버가 더 간단하다는 것이 아니지만 SSE는 일반적으로 웹 서버를 사용하는 반면 WebSockets는 그렇지 않습니다 (기존 웹 인프라와 쉽게 통합되도록 설계되었지만). – kanaka

    2

    작은 WebSocket 메시지에 비해 Ajax 요청이 많습니다. 표준 HTTP 요청 (Ajax)에는 요청마다 쿠키를 포함한 많은 헤더가 포함되지만 WebSocket 메시지는 몇 바이트에 불과합니다.

    HTTP (Ajax) 요청의 장점은 문제 해결에 도움이된다면 캐시하기가 더 쉽다는 것입니다.

    +0

    , AJAX 요청을 캐시 할 수있는 도움이 될 수 없습니다 . AJAX를 사용하여 이미지 나 다른 정적 데이터를 비동기 적으로로드하는 경우 캐싱이 유리하지만 서버 - 클라이언트 통신을위한 것이므로이 시나리오에서 AJAX가 사용되는 클라이언트 -> 서버는 도움이되지 않습니다. – kanaka