답변:
대부분의 경우 WebSockets은 AJAX / HTML 요청보다 확장 성이 뛰어납니다. 그러나 이것이 WebSockets가 모든 AJAX / HTML 사용을 대체한다는 의미는 아닙니다.
각 TCP 연결 자체는 서버 리소스를 거의 사용하지 않습니다. 연결 설정은 비용이 많이 들지만 유휴 연결을 유지하는 것은 거의 무료입니다. 일반적으로 발생하는 첫 번째 제한은 동시에 열 수있는 최대 파일 설명자 (소켓이 파일 설명자를 사용함)입니다. 기본값은 종종 1024이지만 쉽게 더 높게 구성 할 수 있습니다.
수만 명의 동시 AJAX 클라이언트를 지원하도록 웹 서버를 구성한 적이 있습니까? 해당 클라이언트를 WebSockets 클라이언트로 변경하면 가능할 수 있습니다.
HTTP 연결은 열린 파일을 만들지 않거나 오랫동안 포트 번호를 사용하지 않지만 다른 모든 방법으로 더 비쌉니다.
각 HTTP 연결에는 쿠키, 콘텐츠 유형, 콘텐트 길이, 사용자 에이전트, 서버 ID, 날짜, 마지막 수정 등 대부분의 시간 동안 사용되지 않는 많은 수하물이 들어갑니다. WebSockets 연결이 설정되면 응용 프로그램에 필요한 데이터를주고 받아야합니다.
일반적으로 HTTP 서버는 디스크 및 CPU 시간을 차지하는 모든 HTTP 요청의 시작 및 완료를 기록하도록 구성됩니다. WebSockets 데이터의 시작 및 완료를 기록하는 것이 표준이되지만 이중 전송을 수행하는 WebSockets 연결에는 추가적인 로깅 오버 헤드가 없습니다 (응용 프로그램 / 서비스는 예외).
일반적으로 AJAX를 사용하는 대화식 응용 프로그램은 지속적으로 폴링하거나 일종의 장기 폴링 메커니즘을 사용합니다. WebSockets는 서버와 클라이언트가 기존 연결을 통해보고 할 내용이있을 때 서로에게 알리는 이벤트가 더 많은 모델을 수행하는 훨씬 깔끔하고 리소스가 적은 방법입니다.
프로덕션 환경에서 널리 사용되는 대부분의 웹 서버에는 HTTP 요청을 처리하기위한 프로세스 풀 (또는 스레드)이 있습니다. 압력이 증가함에 따라 각 프로세스 / 스레드가 한 번에 하나의 HTTP 요청을 처리하므로 풀 크기가 증가합니다. 각각의 추가 프로세스 / 스레드는 더 많은 메모리를 사용하고 새로운 프로세스 / 스레드를 생성하는 것은 새로운 소켓 연결을 생성하는 것 (프로세스 / 스레드가 여전히해야하는 것)보다 훨씬 비쌉니다. 널리 사용되는 WebSockets 서버 프레임 워크의 대부분은 확장 및 성능이 향상되는 경향이 있습니다.
WebSocket의 주요 이점은 대화식 웹 응용 프로그램에 대한 대기 시간이 짧다는 것입니다. HTTP AJAX / 장기 여론 (애플리케이션 / 서버가 올바르게 설계되었다고 가정)보다 확장 성이 좋고 서버 리소스를 적게 소비하지만 대기 시간이 짧은 IMO는 WebSockets의 주요 이점입니다. AJAX / 장기의 현재 오버 헤드 및 대기 시간
WebSockets 표준이 완성되고 광범위하게 지원되면 서버와 자주 통신해야하는 대부분의 새로운 대화식 웹 응용 프로그램에 표준을 사용하는 것이 좋습니다. 기존의 대화식 웹 애플리케이션의 경우 현재 AJAX / 장기 설문 조사 모델의 작동 상태에 따라 달라집니다. 변환 노력은 사소한 것이 아니기 때문에 많은 경우에 비용은 그만한 가치가 없습니다.
업데이트 :
유용한 링크 : Node.js를 사용하여 AWS에서 600k 동시 웹 소켓 연결
간단히 설명하면 : 서버가 지원할 수있는 클라이언트 연결 수는이 시나리오에서 포트와 관련이 없습니다. 서버는 일반적으로 하나의 단일 포트에서 WS / WSS 연결 만 수신하기 때문입니다. 다른 주석가가 의미하는 것은 파일 설명 자라고 생각합니다. 최대 파일 디스크립터 수를 상당히 높게 설정할 수 있지만 열린 TCP / IP 소켓마다 추가되는 소켓 버퍼 크기를 조심해야합니다. 몇 가지 추가 정보는 다음과 같습니다. /server/48717/practical-maximum-open-file-descriptors-ulimit-n-for-a-high-volume-system
WS와 HTTP를 통한 지연 시간이 줄어든 초기 WS 핸드 셰이크 외에는 더 이상 HTTP 헤더 구문 분석이 없기 때문에 사실입니다. 또한 점점 더 많은 패킷이 성공적으로 전송되면 TCP 혼잡 창이 확대되어 RTT가 효과적으로 줄어 듭니다.
모든 최신 단일 서버는 한 번에 수천 개의 클라이언트 를 서버에 연결할 수 있습니다 . HTTP 서버 소프트웨어는 IOCP (Event-Driven) 지향적이어야합니다 (이전 Apache에서는 하나의 연결 / 하나의 스레드 / 프로세스 방정식이 아닙니다). Windows (http.sys)에 내장 된 HTTP 서버조차도 IOCP 지향적이고 매우 효율적입니다 (커널 모드에서 실행). 이 관점에서 WebSocket과 일반 HTTP 연결 사이의 확장에는 큰 차이가 없습니다. 하나의 TCP / IP 연결은 스레드보다 훨씬 적은 리소스를 사용하며 최신 OS는 많은 동시 연결 처리에 최적화되어 있습니다. WebSocket과 HTTP는이 TCP / IP 사양에서 상속 된 OSI 7 응용 프로그램 계층 프로토콜입니다.
그러나 실험에서 WebSockets의 두 가지 주요 문제가 있습니다.
따라서 모든 프로젝트에 대해 다음을 권장합니다.
- 클라이언트 알림에만 WebSocket을 사용하십시오 (오래 폴링을위한 폴백 메커니즘을 사용함-많은 라이브러리가 있습니다).
- CDN 또는 프록시 용 프록시를 사용하여 다른 모든 데이터에 RESTful / JSON을 사용하십시오.
실제로 전체 WebSockets 응용 프로그램은 확장 성이 좋지 않습니다. 서버에서 클라이언트로 알림을 푸시하기 위해 설계된 용도로 WebSocket을 사용하십시오.
WebSocket 사용의 잠재적 문제에 관하여 :
1. CDN 사용을 고려하십시오
오늘날 (거의 4 년 후) 웹 스케일링은 정적 컨텐츠 (html, css, js)뿐만 아니라 (JSON) 애플리케이션 데이터 에도 CDN ( Content Delivery Network ) 프론트 엔드를 사용합니다 .
물론 모든 데이터를 CDN 캐시에 저장하지는 않지만 실제로는 일반적인 내용이 많이 변경되지 않습니다. REST 리소스의 80 %가 캐시 될 수 있습니다. 1 분 (또는 30 초)의 CDN 만료 시간 종료로도 중앙 서버에 새로운 라이브를 제공하고 애플리케이션 응답 성을 크게 향상시키기에 충분할 수 있습니다. CDN은 지리적으로 조정됩니다 ...
내 지식으로는 CDN에는 아직 WebSockets가 지원되지 않으며 결코 그렇지 않을 것입니다. WebSocket은 상태가 가득 차 있지만 HTTP는 상태가 없으므로 훨씬 쉽게 캐시됩니다. 사실, WebSockets을 CDN 친화적으로 만들기 위해 더 이상 WebSockets가 아닌 Stateless RESTful 접근 방식으로 전환해야 할 수도 있습니다.
2. 보안 문제
WebSocket에는 특히 DOS 공격에 대한 잠재적 인 보안 문제가 있습니다. 새로운 보안 취약점에 대한 그림을 참조 슬라이드 세트 와 이 웹킷 티켓을 .
WebSockets는 오늘날 모든 비즈니스 보안에서 OSI 7 응용 프로그램 계층 수준에서 패킷 검사 가능성을 피합니다. 실제로 WebSockets는 전송을 난독 처리하므로 보안 누출의 주요 위반이 될 수 있습니다.
이 방법을 생각하십시오 : 저렴한 가격, 열린 연결 유지 또는 모든 요청에 대해 새로운 연결 열기 (교섭 오버 헤드가 있으면 TCP임을 기억하십시오)
물론 응용 프로그램에 따라 다르지만 장기 실시간 연결 (예 : AJAX 채팅)의 경우 연결을 유지하는 것이 훨씬 좋습니다.
최대 연결 수는 소켓에 사용 가능한 최대 포트 수로 제한됩니다.
그것은 확장되지 않으며 중간 경로 스위치에 엄청난 작업을 제공합니다. 그런 다음 서버 측에서 페이지 결함 (모든 디스크립터를 유지해야 함)이 높은 값에 도달하고 자원을 작업 영역으로 가져 오는 시간이 증가합니다. 이것들은 주로 JAVA로 작성된 서버이며, 소켓의 소켓을 잡아서 파괴하는 것이 더 빠를 수 있습니다. 머신에서 이러한 서버를 실행하면 다른 프로세스는 더 이상 이동할 수 없습니다.