2011-01-31 11 views
41

비슷한 질문을하기 전에 질문을했고 모두 AJAX가 쓸모 없게되지 않는다는 결론에 도달했습니다. 그러나 ajax는 웹 소켓보다 어떤면에서 더 좋습니까?ajax가 수행 할 websocket/socket.io를 사용할 때의 단점은 무엇입니까?

socket.io를 사용하면 플래시 또는 긴 폴링으로 쉽게 폴백되므로 브라우저 호환성이 문제가 아닌 것으로 보입니다.

웹 소켓은 양방향입니다. 아약스가 비동기 요청을하게되면, websocket 클라이언트는 서버에 메시지를 보냅니다. POST/GET 매개 변수는 JSON으로 인코딩 할 수 있습니다.

그래서 100 % 웹 소켓을 사용할 때 문제가 있습니까? 모든 방문자가 서버에 대한 지속적인 웹 소켓 연결을 유지한다면 방문 세션 전체에 걸쳐 몇 가지 아약스 요청을하는 것보다 낭비가되는 것입니까?

답변

4

아무 문제가 없습니다.

유일한 차이점은 대부분 가독성입니다. Ajax의 가장 큰 장점은 대부분의 기능이 당신을 위해 작성 되었기 때문에 빠른 개발이 가능하다는 것입니다.

소켓을 열 때마다 휠을 다시 발명하지 않아도된다는 장점이 있습니다.

6

조만간 websocket 기반 프레임 워크가 웹 응용 프로그램의 일부처럼 실시간 채팅을 작성하는 것뿐만 아니라 독립형 웹 프레임 워크로도 팝업을 시작한다고 생각합니다. 일단 영구 연결이 생성되면 AJAX 요청을 통해 예를 들어 제공되는 웹 응용 프로그램의 UI 부분을 포함하여 모든 종류의 물건을 수신하는 데 사용할 수 있습니다. 이 접근 방식은 중복 HTTP 헤더를 포함하는 비동기 요청에 의해 생성 된 트래픽 및로드의 양을 줄일 수는 있지만 SEO를 어떤 방식 으로든 해칠 수 있습니다.

그러나 영구 연결이 불필요하거나 원치 않는 시나리오가 많기 때문에 웹 소켓이 AJAX를 대체하거나 위험에 빠뜨리는 것은 의심 스럽습니다. 예를 들어 클라이언트와 영구적으로 연결될 필요가없는 단일 용도의 REST 기반 서비스를 (한 번) 사용하는 매시업 애플리케이션.

30

나는 그것이 더 낭비 적이라고 생각한다. 연결된 모든 클라이언트에 대해 서버의 어떤 종류의 객체/함수/코드/그 어떤 클라이언트와도 쌍을 이루는 것이 필요합니다. 소켓 처리기 또는 파일 설명자 또는 서버가 연결을 처리하도록 설정되어 있습니다.

AJAX를 사용하면 서버 측 리소스를 클라이언트에 1 : 1로 매핑 할 필요가 없습니다. 클라이언트 수는 서버 측 리소스보다 덜 의존적으로 확장 할 수 있습니다. node.js조차도 처리 할 수있는 연결 수에 제한이 있습니다.

다른 고려해야 할 사항은 특정 AJAX 응답도 캐시 할 수 있다는 것입니다. 규모를 확장하면 HTTP 캐시를 추가하여 잦은 AJAX 요청으로 인한로드를 줄일 수 있습니다.

+0

나는 이것이 옳다고 믿습니다. 양방향 통신이 필요없는 응용 프로그램에서는 서버에서 ajax 요청이 훨씬 더 쉬워집니다. 또한 HTML5 오프라인 지속성을 사용할 수있게되면 (기본적으로 웹 소켓이 더 많이 사용 가능할 때와 마찬가지로) 웹 응용 프로그램은 필요에 따라 서버와 동기화됩니다. – badunk

18

개인적으로, 나는 웹 소켓이 AJAX 대신 웹 어플리케이션에서 점점 더 많이 사용될 것이라고 생각합니다. 그들은 웹 사이트에 적합하지 않으며 캐싱과 SEO는 더 큰 관심사이지만 웹 앱에 대한 경이로움을 나타낼 것입니다.

DNode 및 socketstream과 같은 프로젝트는 복잡성을 제거하고 간단한 RPC 스타일 코딩을 가능하게합니다. 즉, 클라이언트 코드가 서버의 함수를 호출하고 원하는 데이터를 원하는 함수로 전달합니다. 그리고 서버는 클라이언트에서 함수를 호출하고 데이터도 전달할 수 있습니다. TCP의 핵심에 관심을 가질 필요는 없습니다.

또한 AJAX 호출에 많은 오버 헤드가 있습니다. 예를 들어, 연결이 설정되고 모든 요청에 ​​HTTP 헤더 (쿠키 등)가 전달되어야합니다. 웹 소켓은 그 중 많은 부분을 제거합니다. 어떤 사람들은 웹 소켓이 더 많은 낭비를 겪고 있다고 말하고, 아마도 그들은 맞을 수도 있습니다. 그러나 나는 그 차이가 실제로 상당한 것이라고 확신하지는 않습니다.

관련 리소스에 대한 많은 링크를 포함하여 다른 관련 질문에 대한 답변을 자세히 읽었습니다. 당신은 그것을 확인 수 있습니다

websocket api to replace rest api?

2

WS를 : // 연결은 "AJAX"요청보다 훨씬 적은 오버 헤드를 가지고있다. 웹 소켓이 활성 상태로 유지

19

짧은 대답
아약스는 당신이 그것으로 무슨 일을하는지에 따라, 한 번만 비용이 여부, 클라이언트와 서버 모두에 대한 비용을 가지고 있습니다.

긴 대답
WebSocket을 종종 있기 때문에이 전체의 오해 "할 것입니다 이봐, 사용 아약스,!". 아닙니다. 웹 소켓은 Ajax를 대신 할 수 없습니다. 잠재적으로 동일한 필드에 적용될 수 있지만 Websocket을 사용하는 것은 터무니없는 경우가 있습니다.

간단한 예를 들어 보겠습니다. 페이지가 클라이언트 측에로드 된 후 데이터를로드하는 동적 페이지. 간단합니다. Ajax 전화를 걸자. 서버에서 클라이언트까지 한 방향 만 있으면됩니다. 클라이언트는이 데이터를 요청할 것이고, 서버는 클라이언트에게 클라이언트를 보냅니다. 왜 그런 작업을 위해 웹 소켓을 구현합니까? 당신은 당신의 연결이 항상 열려 있어야 할 필요가 없습니다, 당신은 클라이언트가 끊임없이 서버에 물어볼 필요가 없으며, 서버에 클라이언트를 알릴 필요가 없습니다. 연결을 열어두면 자원을 낭비합니다. 연결을 열어두기 위해서는 끊임없이이를 확인해야합니다.

이제 채팅 응용 프로그램의 경우는 완전히 다릅니다. 클라이언트가 새로운 것이면 x 초 또는 밀리 초마다 서버에 요청하도록 강제하지 않고 서버가 클라이언트에 통지해야합니다. 그것은 말이되지 않습니다.

더 잘 이해하려면 두 사람으로 확인하십시오. 둘 중 하나는 서버이고, 이상은 클라이언트입니다. 아약스는 편지를 보내는 것과 같습니다. 클라이언트가 문자를 보내면 서버는 다른 문자로 응답합니다. ? 사실은 대화가 그렇게 될 것 채팅 응용 프로그램,이다 : 이봐, 서버 나를 위해 뭔가있어
- - - - - 제

"이봐 서버,
나를 위해 뭔가있어 제
를? - 헤이 서버, 나에게 뭔가있어?
- 예, 여기 있습니다. "
클라이언트가 응답을 요청하지 않은 경우 서버는 실제로 클라이언트에게 문자를 보낼 수 없습니다. 거대한 자원 낭비입니다. 모든 Ajax 요청에 대해 캐시 된 경우에도 서버 측에서 작업해야한다.

이제 Ajax로로드 된 데이터로 앞에서 설명한 경우가 있습니다. 클라이언트가 서버에 전화를한다고 상상해보십시오. 연결을 활성 상태로 유지하면 비용이 발생합니다. 그것은 전기 비용이 들고 운영자에게 비용을 지불해야합니다. 왜 그 사람이 당신에게 3 단어를 말하기를 원한다면, 왜 누군가에게 전화를해서 1 시간 동안 전화를해야합니까? 빌어 먹을 편지를 보내.

결론 웹 소켓은 Ajax를 대체하지 않습니다!
가끔 이 필요합니다. 아약스, 웹 소켓 사용법이 어리석은 곳.

편집 : SSE의 경우 기술이 널리 사용되지하지만 유용 할 수
. 이름에서 알 수 있듯이 Server-Sent Events는 서버에서 클라이언트로의 단방향 푸시입니다. 클라이언트가 아무 것도 요청하지 않으면 서버가 데이터를 보냅니다. 한마디로

:
이 - 클라이언트에서 단방향 : - : SSE
- 양방향 : 아약스
서버에서 단방향 다른 사람들이 어떤 상황에서 과잉이 될 수 열려있는 연결을 유지 말했듯이

1

를 WebSocket을 여기서 클라이언트 대 서버 알림이 필요하지 않거나 클라이언트 대 서버 요청이 낮은 빈도로 발생합니다.

그러나 웹 소켓은 낮은 수준의 프로토콜이며 초기 핸드 셰이크가 수행되면 TCP에 추가 기능을 제공하지 않습니다. 따라서 웹 소켓을 통해 요청 - 응답 패러다임을 구현할 때 캐싱 (클라이언트 및 공유 캐시), 유효성 검사 (조건부 요청), 안전성 및 멱등 원과 같은 HTTP (매우 성숙하고 긴밀한 프로토콜 패밀리)가이라는 기능을 제공하지 못하게됩니다. () 범위 요청, 컨텐트 유형, 상태 코드 등)에 대한 정보를 제공합니다.

즉, 비용을 줄이면 메시지 크기가 줄어 듭니다.

그래서 나의 선택은 요청 - 응답 AJAX를 당신이 열려있는 서버에 대한 연결을 원하는 경우에 밀어 서버와 고주파 낮은 레이턴시 메시징

1

에 대한 WebSocket을 서버에 대한 지속적인 폴링이있을 것입니다 경우 다음 소켓에 갈 그렇지 않으면 아약스와 함께 가기 좋습니다.

간단한 유추 : Ajax는 서버 및 서버에 대한 질문 (요청)을 통해 이러한 질문에 대한 대답 (응답)을 제공합니다. 이제 아약스가 계속 질문을하고 싶다면 아약스는 작동하지 않을 것입니다. 양쪽 모두에 리소스가 필요할 큰 오버 헤드가 있습니다.