어떤 상황에서 AJAX long / short polling이 HTML5 WebSocket보다 선호됩니까?


306

친구를위한 작은 채팅 응용 프로그램을 작성하고 있지만 페이지를 새로 고치는 것만 큼 수동적이거나 기초적이지 않은 정보를 적시에 얻는 방법에 대해서는 잘 모르겠습니다.

현재 간단한 AJAX를 사용하여 이것을 구현하고 있지만 짧은 타이머가 경과하면 정기적으로 서버를 누르는 단점이 있습니다.

Long / Short Polling을 조사 할 때 HTML5 WebSocket을 살펴 보았습니다. 이 보인다 쉽게 구현할 수 있지만, 일부 숨겨진 단점가 있는지 확실하지 않습니다. 예를 들어 WebSockets는 특정 브라우저에서만 지원된다고 생각합니다. WebSockets에 대해 알아야 할 다른 단점이 있습니까?

두 기술이 모두 같은 역할을하는 것처럼 보이기 때문에 어떤 시나리오에서 하나를 사용하는 것을 선호합니까? 보다 구체적으로, HTML5 WebSockets가 AJAX long / short polling을 쓸모 없게 만들었습니까, 아니면 WebSockets보다 AJAX를 선호해야하는 강력한 이유가 있습니까?

답변:


508

WebSockets는 확실히 미래입니다.

긴 폴링은 AJAX와 같이 각 요청에 대한 연결을 만드는 것을 막는 더러운 해결 방법이지만 WebSocket이 존재하지 않을 때 긴 폴링이 생성되었습니다. 이제 WebSocket으로 인해 긴 폴링이 사라집니다.

WebRTC는 피어 투 피어 통신을 허용합니다.

WebSockets를 배우는 것이 좋습니다 .

비교:

웹상의 다양한 통신 기술

  • AJAX - requestresponse. 서버에 대한 연결을 작성하고 선택적 데이터와 함께 요청 헤더를 전송하고 서버에서 응답을 얻은 후 연결을 닫습니다. 모든 주요 브라우저에서 지원됩니다.

  • 긴 설문 조사 - requestwaitresponse. AJAX와 같이 서버에 대한 연결을 작성하지만 얼마 동안 (계속) 연결 유지 연결을 유지합니다. 연결 중에 열린 클라이언트는 서버에서 데이터를 수신 할 수 있습니다. 시간 초과 또는 데이터 eof로 인해 연결이 종료 된 후 클라이언트는 주기적으로 다시 연결해야합니다. 서버 측에서는 AJAX와 동일한 HTTP 요청처럼 처리됩니다. 단, 요청시 응답은 현재 또는 향후에 애플리케이션 로직에 의해 정의 될 것입니다. 지원 차트 (전체) | 위키 백과

  • WebSocket을 - clientserver. 서버에 대한 TCP 연결을 작성하고 필요한만큼 열어 두십시오. 서버 나 클라이언트는 연결을 쉽게 닫을 수 있습니다. 클라이언트는 HTTP 호환 핸드 셰이크 프로세스를 거칩니다. 성공하면 서버와 클라이언트는 언제든지 양방향으로 데이터를 교환 할 수 있습니다. 응용 프로그램이 두 가지 방식으로 자주 데이터를 교환해야하는 경우 효율적입니다. WebSocket에는 클라이언트에서 서버로 전송되는 각 메시지에 대한 마스킹을 포함하는 데이터 프레임이 있으므로 데이터가 단순히 암호화됩니다. 지원 차트 (매우 좋음) | 위키 백과

  • WebRTC - peerpeer. 전송은 클라이언트간에 통신을 설정하고 전송에 독립적이므로 UDP, TCP 또는 훨씬 더 추상적 인 계층을 사용할 수 있습니다. 일반적으로 비디오 / 오디오 스트리밍과 같은 대용량 데이터 전송에 사용되며, 신뢰성이 2 차이고 응답 시간 및 적어도 일부 데이터 전송을 위해 몇 개의 프레임 또는 품질 진행 감소가 희생 될 수 있습니다. 양쪽 (피어)은 서로 독립적으로 데이터를 푸시 할 수 있습니다. 중앙 서버와는 완전히 독립적으로 사용할 수 있지만 여전히 엔드 포인트 데이터를 교환 할 수있는 방법이 필요합니다. 대부분의 경우 개발자는 중앙 서버를 사용하여 피어를 "링크"합니다. 이는 중앙 집중식 서버가 필요하지 않은 연결을 설정하기 위해 필수 데이터를 교환하는 데만 필요합니다. 지원 차트 (중간) | 위키 백과

  • 서버가 보낸 이벤트 - clientserver. 클라이언트는 서버에 지속적이고 장기적인 연결을 설정합니다. 서버 만이 클라이언트에게 데이터를 보낼 수 있습니다. 클라이언트가 서버로 데이터를 보내려면 다른 기술 / 프로토콜을 사용해야합니다. 이 프로토콜은 HTTP와 호환되며 대부분의 서버 측 플랫폼에서 구현하기가 쉽습니다. Long Polling 대신 사용하기에 바람직한 프로토콜입니다. 지원 차트 (IE 제외) | 위키 백과

장점 :

WebSockets 서버 측 의 주요 장점은 HTTP 요청 (핸드 셰이크 후)이 아니라 적절한 메시지 기반 통신 프로토콜이라는 것입니다. 이를 통해 엄청난 성능 및 아키텍처 이점을 얻을 수 있습니다 . 예를 들어 node.js에서 다른 소켓 연결에 대해 동일한 메모리를 공유 할 수 있으므로 각 공유 변수에 액세스 할 수 있습니다. 따라서 데이터베이스를 중간에 교환 지점으로 사용할 필요가 없습니다 (예 : AJAX 또는 Long Polling과 같이 PHP와 같은 언어 사용). RAM에 데이터를 저장하거나 소켓간에 즉시 다시 게시 할 수도 있습니다.

보안 고려 사항

사람들은 종종 WebSockets의 보안에 대해 걱정합니다. 실제로는 차이가 적거나 WebSocket을 더 나은 옵션으로 사용합니다. 우선 AJAX를 사용하면 각 요청이 인터넷 인프라를 통과하는 새로운 TCP 연결이므로 MITM 가능성이 높아집니다 . WebSocket을 사용하면 일단 연결되면 데이터를 클라이언트에서 서버로 스트리밍 할 때 프레임 마스킹을 강화하고 추가 압축을 수행하여 데이터를 조사하는 데 더 많은 노력이 필요합니다. 모든 최신 프로토콜은 HTTP 및 HTTPS (암호화)를 모두 지원합니다.

추신

WebSocket은 일반적으로 http 와는 달리 실시간 게임과 비슷하지만 네트워킹대해 매우 다른 논리 접근 방식을 가지고 있음을 기억 하십시오.


15
자체 호환성에 관한 것이 아닙니다. 의사 소통이 일어나는 방식을 완전히 다시 생각해야한다는 것이 가장 중요합니다. RESTful API가 요청> 응답 패턴과 함께 작동하므로 여기서 양방향 통신은 의미가 없습니다. 따라서 Webfulcket을 사용하여 RESTful API를 쿼리하려고 시도하는 것은 약간 이상한 시도이며 전혀 이점을 볼 수 없습니다. RESTful API의 데이터가 필요하지만 실시간으로 필요한 경우 WebSockets와 같은 양방향 통신에서 작동하는 데이터를 푸시하기 위해 WebSockets API를 작성하십시오. 당신은 그들이 비교할 수없는 각도로 물건을 비교하려고합니다 :)
moka

2
안녕하세요 @pithhelmet 그것은 모두 서버 측 소프트웨어 (언어 / 기술) 자체에 달려 있습니다. WebSocket은 TCP를 통한 계층이며 TCP 스트림 구현을 수행하는 많은 방법이 있습니다. 최신 웹 서버는 이벤트 기반 아키텍처를 사용하며 스레드 풀에서 매우 효율적입니다. 어떤 기술을 사용하고 있습니까? Node.js는 IO에 대한 비하인드 이벤트와 실행 컨텍스트에서 단일 스레드가있는 이벤트를 사용하므로 놀랍도록 효율적입니다. 각 연결에 스레드를 사용하면 CPU뿐만 아니라 RAM (스레드 당 1mb +) 측면에서도 매우 비효율적입니다. 스레드는 유휴 상태이거나 더 나빠질 수 있기 때문에 데이터를 확인하는 무한 루프입니다.
moka

4
긴 폴링은 해결 방법이 아니며 webSocket과 다릅니다. 이 두 가지는 다른 시나리오에서 사용하기위한 것입니다.
bagz_man

5
@bagz_man Long Polling은 기술이 정의에 의해 허용되지 않았으며 표준 대안이 없었던 결과를 달성하기 위해 기술을 "해킹"하는 것입니다. Long Polling이 존재하는 이유는 WS가 없었던 사실입니다.
moka

4
@moka : Cloudflare의 프리 티어 는 지속적인 400 + Gbps 공격을 흡수합니다. 지갑이 AWS 청구서를 흡수 할 수 있습니까? 또한 AWS와 Cloudflare는 귀하의 출처에 대한 불만을 처리 할 때 반대 견해를 가지고 있습니다. 트레이드 오프를 논의하는 한 명심해야 할 것입니다. :)
danneu

11

생략 한 경합 기술 중 하나는 Server-Sent Events / Event Source입니다. 롱 폴링, 웹 소켓, SSE (Server-Sent Events) 및 혜성이란 무엇입니까? 이 모든 것들에 대한 좋은 토론이 있습니다. 이들 중 일부는 다른 서버보다 서버 측에서 통합하기가 쉽다는 점을 명심하십시오.


이 모든 것 중에서 살펴 보라고 제안 하시겠습니까?
somdow

나는 긴 폴링으로 성공했습니다. (트릭 및 기타 기술의 유일한 트릭은 서버 스레드를 묶지 않는 것입니다.) 비동기 서버 코드를 사용하지 않으면 확장되지 않습니다.
bmm6o

1
@somdow Maksims-Mihejevs는 그의 답변의 첫 두 단락에서 귀하의 질문에 훌륭하게 답변했습니다. 웹 소켓을 사용하십시오.
Jeff Sheffield

7

채팅 응용 프로그램 또는 서버와 지속적으로 대화하는 다른 응용 프로그램의 WebSockets경우 가장 좋은 옵션입니다. 그러나 WebSockets서버를 지원하는 서버 에서만 사용할 수 있으므로 필요한 라이브러리를 설치할 수없는 경우 서버를 사용하는 기능이 제한 될 수 있습니다. 이 경우 Long Polling비슷한 기능을 얻기 위해 사용해야 합니다.


5
WebSocket은 모든 서버에서 지원됩니다 ... node.js 또는 이와 유사한 것을 설치하면됩니다.
noob

9
모든 서버가 WebSocket을 지원한다는 것을 설명하기 위해 약간의 조정을했습니다. 그러나 호스팅 서비스를 사용하는 경우 해당 서비스를 사용하지 못할 수 있습니다.
브랜트 올슨

이 스레드가 약간 오래되었다는 것을 알고 있지만 ... WebSockets가 모든 양방향 통신에 가장 적합한 답변은 아닙니다. 나는 최근 Spring 4의 웹 소켓 지원에 대한 문서에서 WebSockets가 많은 양의 데이터를 이동하거나 대기 시간이 짧은 데 더 적합하다는 것을 알았습니다. 해당 사항이 적용되지 않거나 우선 순위가 아닌 경우 긴 폴링을 사용하는 것이 좋습니다. 나는이 견해에 대한 완전한 정당화를 모른다. 나는 단지 스프링 사람들이 그들이 일반적으로 무엇을 말하는지 알고 있다고 생각했다.
Stoney

1
@Stoney는 서버에서 웹 소켓 (핸들러 등)을 설정해야한다는 사실과 별개로 웹 소켓을 통해 롱 폴링을 사용할 이유가 없습니다. Websocket은 훨씬 빠르며 (대기 시간이 짧음) 클라이언트가 요청하지 않고도 서버가 클라이언트와 "통신"할 수 있습니다. 요즘 나는 Signaler (내 생각에 가장 좋은 웹 소켓 구현 중 하나-클라이언트와 서버에서 실행되며 클라이언트가 차이가없는 것처럼 서버와 클라이언트에서 서버에서 메소드를 호출 할 수있게 해줍니다) 웹 사이트를 걸 - 등 동적 콘텐츠 로딩, 밑 페이지,
DividedByZero

0

XHR 폴링 및 SSE 및 웹 소켓 비교

  • XHR 폴링 이벤트가 발생하면 (즉시 또는 지연 후) 요청에 응답합니다. 추가 요청을 받으려면 후속 요청이 필요합니다.

    브라우저는 서버의 비동기 요청을하므로 응답하기 전에 데이터를 사용할 수있을 때까지 기다릴 수 있습니다. 응답에는 클라이언트가 실행할 인코딩 된 데이터 (일반적으로 XML 또는 JSON) 또는 Javascript가 포함될 수 있습니다. 응답 처리가 끝나면 브라우저는 다른 XHR을 만들어 보내 다음 이벤트를 기다립니다. 따라서 브라우저는 항상 서버에서 미해결 요청을 유지하여 각 이벤트가 발생할 때마다 응답합니다. 위키 백과

  • 서버 송신 이벤트 클라이언트는 서버로 요청을 보냅니다. 서버는 언제든지 웹 페이지에 새 데이터를 보냅니다.

    전통적으로 웹 페이지는 새로운 데이터를 받기 위해 서버에 요청을 보내야합니다. 즉, 페이지는 서버에서 데이터를 요청합니다. 서버에서 보낸 이벤트를 사용하면 서버가 메시지를 웹 페이지로 푸시하여 언제든지 새 데이터를 웹 페이지로 보낼 수 있습니다. 이러한 수신 메시지는 웹 페이지 내에서 Events + data로 취급 될 수 있습니다. 모질라

  • WebSockets 초기 핸드 셰이크 후 (HTTP 프로토콜을 통해). 통신은 WebSocket 프로토콜을 사용하여 양방향으로 수행됩니다.

    핸드 셰이크는 HTTP 요청 / 응답으로 시작하여 서버가 동일한 포트에서 WebSocket 연결뿐만 아니라 HTTP 연결을 처리 할 수 ​​있도록합니다. 연결이 설정되면 통신은 HTTP 프로토콜을 준수하지 않는 양방향 이진 프로토콜로 전환됩니다. 위키 백과

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.