HTML WebSocket은 각 클라이언트에 대해 열린 연결을 유지합니까? 이 규모입니까?


159

HTML WebSockets의 확장성에 대한 정보가 있다면 궁금합니다. 내가 읽은 모든 것에 대해 모든 클라이언트가 서버와의 열린 통신 회선을 유지하는 것으로 보입니다. 서버가 처리 할 수있는 확장 성 및 개방형 WebSocket 연결 수를 궁금합니다. 어쩌면 그 연결을 열어 두는 것은 실제로 문제가되지 않지만 실제로는 느낌이 듭니다.


1
HTML WebSocket과 같은 것은 없습니다. 당신은 HTTP WebSocket을 의미합니다.
Lorne의 후작

답변:


209

대부분의 경우 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 동시 웹 소켓 연결


4
멋진 anser. 답변 해 주셔서 감사합니다.
라이언 몽고메리

7
그래도 일단 벽에 부딪친 후에는 어떻게 확장해야할지 모르겠습니다. WebSockets가 더 적은 리소스를 소비한다는 것은 사실이지만 (수직 확장 가능) HTTP는 수평 확장에 적합합니다. 이론적으로 서버를 추가하여 무한대로 확장 할 수 있습니다. 한 상자의 용량을 사용한 후에는 확장하는 방법에 대해 항상 혼란스러워했습니다. 생각?
Sean Clark Hess

6
@Sean. 수평으로 확장 할 때 WebSocket이 반드시 나빠지는 것은 아닙니다. 단순히 쉽게 확장 할 수없는 새로운 응용 프로그램을 엽니 다. 예를 들어, 정적 데이터를 제공하기 위해 다수의 WebSocket 서버는 다수의 HTTP 서버보다 확장 성이 우수합니다. 지연 시간이 짧은 실시간 게임은 전송에 관계없이 확장하기가 어렵습니다 (HTTP를 사용하여 실제로 실행 가능한 것은 아닙니다). 실제 질문은 데이터 / 애플리케이션의 확장 정도입니다. 그 규모가
커지면

2
한 가지 수정-TCP 연결은 대상 IP 및 대상 포트로 구성됩니다. 즉, ± 64k 포트 제한은 실제로 단일 클라이언트에만 해당됩니다. 이론적으로 서버는 하드웨어에 의해서만 제한되는 개방 된 연결 수를 가질 수 있습니다.
Rizon

@Rizon, 사실입니다. 나는 대답을 업데이트하고 열린 포트 제한을 변경했으며 사람들이 가장 먼저 접하게되는 파일 설명자 제한을 언급했습니다.
카나 카

36

간단히 설명하면 : 서버가 지원할 수있는 클라이언트 연결 수는이 시나리오에서 포트와 관련이 없습니다. 서버는 일반적으로 하나의 단일 포트에서 WS / WSS 연결 만 수신하기 때문입니다. 다른 주석가가 의미하는 것은 파일 설명 자라고 생각합니다. 최대 파일 디스크립터 수를 상당히 높게 설정할 수 있지만 열린 TCP / IP 소켓마다 추가되는 소켓 버퍼 크기를 조심해야합니다. 몇 가지 추가 정보는 다음과 같습니다. /server/48717/practical-maximum-open-file-descriptors-ulimit-n-for-a-high-volume-system

WS와 HTTP를 통한 지연 시간이 줄어든 초기 WS 핸드 셰이크 외에는 더 이상 HTTP 헤더 구문 분석이 없기 때문에 사실입니다. 또한 점점 더 많은 패킷이 성공적으로 전송되면 TCP 혼잡 창이 확대되어 RTT가 효과적으로 줄어 듭니다.


AFAIR에는 하나의 들어오는 포트가 있지만 각 연결마다 항상 하나의 나가는 포트가 열려 있습니다. 이것은 실제로 C10k 문제 의 한 부분 일뿐입니다 .
Arnaud Bouchez

14

모든 최신 단일 서버는 한 번에 수천 개의 클라이언트 를 서버에 연결할 수 있습니다 . HTTP 서버 소프트웨어는 IOCP (Event-Driven) 지향적이어야합니다 (이전 Apache에서는 하나의 연결 / 하나의 스레드 / 프로세스 방정식이 아닙니다). Windows (http.sys)에 내장 된 HTTP 서버조차도 IOCP 지향적이고 매우 효율적입니다 (커널 모드에서 실행). 이 관점에서 WebSocket과 일반 HTTP 연결 사이의 확장에는 큰 차이가 없습니다. 하나의 TCP / IP 연결은 스레드보다 훨씬 적은 리소스를 사용하며 최신 OS는 많은 동시 연결 처리에 최적화되어 있습니다. WebSocket과 HTTP는이 TCP / IP 사양에서 상속 된 OSI 7 응용 프로그램 계층 프로토콜입니다.

그러나 실험에서 WebSockets의 두 가지 주요 문제가 있습니다.

  1. CDN을 지원하지 않습니다.
  2. 보안 문제가있을 수 있습니다.

따라서 모든 프로젝트에 대해 다음을 권장합니다.

  • 클라이언트 알림에만 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는 전송을 난독 처리하므로 보안 누출의 주요 위반이 될 수 있습니다.


2
@ArnaudBouchez-CDN에 대한 멋진 설명을 위해 +1. 빠른 후속 질문-이벤트 전달 네트워크의 실현 가능성에 대해 어떻게 생각하십니까? CDN 이후 패턴 화되었지만 웹 소켓 또는 아직 보이지 않는 기술을 통해 스트리밍 데이터 등을 제공하는 데 적합합니다.
quixver

8

이 방법을 생각하십시오 : 저렴한 가격, 열린 연결 유지 또는 모든 요청에 ​​대해 새로운 연결 열기 (교섭 오버 헤드가 있으면 TCP임을 기억하십시오)

물론 응용 프로그램에 따라 다르지만 장기 실시간 연결 (예 : AJAX 채팅)의 경우 연결을 유지하는 것이 훨씬 좋습니다.

최대 연결 수는 소켓에 사용 가능한 최대 포트 수로 제한됩니다.


WebSocket을 사용하지 않고 연결을 열어 둘 수 있습니다 (HTTP / 1.1의 활성 유지 옵션 덕분에). 나는 당신의 요점을 이해하지 못합니다.
Arnaud Bouchez

1
+1. 사람들은 TCP 연결을 설정하는 것을 잊어 버리는 경향이 있습니다. syn / ack / ack이 필요하며 TLS는 키 교환을 위해 더 많은 왕복이 필요합니다.
quixver

1
@ArnaudBouchez check en.wikipedia.org/wiki/HTTP_persistent_connection#HTTP_1.1 WebSocket은 원하는만큼 열려 있고 해킹 되지 않습니다 (긴 폴링 및 기타 대안).
kaoD

-5

그것은 확장되지 않으며 중간 경로 스위치에 엄청난 작업을 제공합니다. 그런 다음 서버 측에서 페이지 결함 (모든 디스크립터를 유지해야 함)이 높은 값에 도달하고 자원을 작업 영역으로 가져 오는 시간이 증가합니다. 이것들은 주로 JAVA로 작성된 서버이며, 소켓의 소켓을 잡아서 파괴하는 것이 더 빠를 수 있습니다. 머신에서 이러한 서버를 실행하면 다른 프로세스는 더 이상 이동할 수 없습니다.

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