분류 Nodejs

Load Testing Socket.IO 웹 응용 프로그램 및 인프라

컨텐츠 정보

  • 조회 517 (작성일 )

본문

Socket.IO 기반 WebSocket 서버의 로드 테스트를 위한 학습서.


확장 가능한 실시간 백엔드를 제공합니까? 이 기사는 Socket.IO 기반 WebSocket 서버의 로드 테스트를 위한 튜토리얼을 제공하여 프로덕션 로드를 시뮬레이션하고 성능 병목 현상 또는 확장 성 문제를 식별합니다.


Socket.IO는 WebSocket 프로토콜 위에 구축 된 프레임 워크로, WebSocket 핸드 셰이크를 시작하는 Upgrade : websocket 헤더를 사용하여 HTTP 연결을 업그레이드합니다.


이는 클라이언트가 서버를 폴링 할 필요 없이 언제라도 양 당사자가 메시지를 생성 할 수 있는 클라이언트와 서버 간의 지속적인 연결을 제공합니다.


https://medium.com/better-programming/load-testing-socket-io-web-applications-and-infrastructure-3e96011898e0 


Socket.IO는 WebSocket을 지원하지 않는 클라이언트 또는 네트워크상의 클라이언트를 사용할 때 Ajax 요청으로 폴백하는 옵션을 제공하여 애플리케이션의 브라우저 및 장치 지원을 늘리는 등 추가 기능을 추가합니다. HTTP 헤더 또는 프로토콜 변경을 업그레이드하십시오.


설정 


이 튜토리얼을 따라하기 위해 데모 저장소를 로컬로 복제하고 실행하거나 (제 안됨) Heroku에서 내가 호스팅 한 버전을 사용할 수 있습니다.


앱을 로컬로 실행하도록 선택하면 리포지토리를 복제하고 npm을 사용하여 필요한 종속성을 설치해야 합니다. npm 시작 스크립트는 구성된 PORT에서 앱을 시작하거나 기본적으로 8080입니다.


먼저 응용 프로그램에 익숙해 지도록 하겠습니다. 일단 실행되면 응용 프로그램은 다음과 같이 작동합니다.


주목할 주요 기능은 사용자 간에 실시간 메시지를 보내고 대화방의 현재 참가자 수를 볼 수 있다는 것입니다.


아래는 실시간으로 메시지를 주고 받는 두 명의 다른 사용자의 예입니다.


1*FeWMql6QYKwzJeLz62JgJg.gif 


부하 테스트 


이제 애플리케이션을 설정 했으므로 로드 테스트를 시작할 수 있습니다. 이를 위해 무료 오픈 소스 로드 테스트 및 기능 테스트 툴킷 인 Artillery Community Edition 도구를 사용합니다.


Artillery.io 툴킷을 전체적으로 설치하려면 :


$ npm install artillery -g 


다음으로 테스트 구성 및 시나리오를 지정하는 YAML 구성 파일을 작성해야 합니다.


simple-test.yaml 


config:
target: "wss://socketio-loadtest.herokuapp.com"
socketio:
transports: ["websocket"]
phases:
- duration: 10 # Run scenario for 10 seconds
arrivalCount: 20 # Create 20 virtual users per scenario
scenarios:
- engine: "socketio"
flow:
- emit:
channel: "add user"
data: "John Doe"
- emit:
channel: "new message"
data: "Hello! {{ $randomString() }}"
- think: 5 # do nothing for 5 seconds, then disconnect 


위의 구성 파일에서 대상 URL과 Socket.IO 엔진을 지정합니다. 에뮬레이션 할 가상 사용자 수와 테스트 기간을 지정하도록 단계 섹션을 구성합니다. 처음에 이들은 낮은 숫자입니다.


시나리오 섹션에서는 artillery.io 클라이언트가 서버로 전송할 WebSocket 이벤트를 지정합니다.


이 간단한 예제에서는 데모 애플리케이션에서 사용자 추가 이벤트를 사용하여 채팅에 새 사용자를 추가 한 다음 새 메시지를 게시합니다. 5 초 후 사용자가 WebSocket 연결을 끊습니다.


위 스크립트를 실행하기 위해 포병 실행 명령을 사용합니다.


$ artillery run load-test/simple-test.yaml 


브라우저에서 (로컬 또는 https://socketio-loadtest.herokuapp.com에서) 응용 프로그램을 보면 가상 사용자가 대화방에 참여하고 메시지를 남길 수 있습니다.


1*7O5Q3Esa9iS-zs8BxKukSQ.gif 


위의 간단한 스크립트는 구성 값을 조정하여 시나리오에서 사용자 수를 늘리려면 수정할 수 있습니다. 보다 고급 테스트를 위해 아래에서 더 자세한 시나리오 예를 찾을 수 있습니다.


Assertions 


도구 설정이 완료되었으므로 특정 조건에 따라 작업이 실패하도록 설정할 수 있습니다. 이는 CI 환경에 적합합니다.


최소, 최대, 중앙값, p95 및 p99에 대해 최대 허용 대기 시간 (밀리 초) 또는 최대 실패율을 설정할 수 있습니다. 특정 비즈니스 규칙 또는 SLO를 다시 테스트하도록 구성 할 수 있습니다.


위를 구성하기 위해 구성에 확실한 항목을 추가합니다. 추가 예제는 artillery.io 문서에서 찾을 수 있습니다.


config:
target: "ws://localhost:8080"
ensure:
maxErrorRate: 1 # fail if error rate exceeds 1%
max: 500 # fail if max response time exceeds 500ms 


고급 구성 


고급 예제에서는 동적 변수를 사용하여 프로덕션 (실제 데이터)에서 응용 프로그램을 사용하는 방법에 더 가까운 시나리오를 시뮬레이션 합니다. 이것은 사용자 정의 코드를 실행할 수 있는 사용자 정의 프로세서 내부의 가짜 npm 모듈을 사용하여 수행됩니다.


로드 단계는 2 분에 걸쳐 도착률을 10 명에서 50 명으로, 초당 50 명의 신규 사용자에서 10 분을 늘리도록 구성됩니다.


advanced-test.yaml 


config:
target: "ws://localhost:8080"
ensure:
max: 500 # fail if max response time exceeds 500ms
maxErrorRate: 1 # fail if error rate exceeds 1%
socketio:
transports: ["websocket"]
processor: "./custom.js" # set a processor for dynamic variables
phases:
- duration: 120
arrivalRate: 10
rampTo: 50
name: "Warm up phase"
- duration: 600
arrivalRate: 50
name: "Sustained max load"
scenarios:
- engine: "socketio"
flow:
- function: "getChatData" # load variables
- emit:
channel: "add user"
data: "{{ name }}"
- emit:
channel: "new message"
data: "{{ greeting }}"
- think: 10 # stay connected for 10 seconds
- emit:
channel: "new message"
data: "{{ goodbye }}" 


advanced-test.yaml 파일을 사용하여 포병 실행


$ artillery run load-test/advanced-test.yaml 


1*xS97tVPZAf7c50NQ1BQNAA.gif 


위는 구성 파일에 정의 된 램프 업 단계의 스니펫으로, 가상 사용자의 도착률이 2 분 동안 10 명에서 50 명으로 증가합니다.


처리 할 수 있는 동시 연결 수 또는 성능이 저하되기 전의 최대 사용자 수와 같이 실행하려는 테스트 유형에 따라 여러 가지 방법으로 고급 시나리오 예제를 조정할 수 있습니다.


요약 


Socket.IO 응용 프로그램의 로드 테스트는 응용 프로그램 수명 주기에서 중요한 단계입니다.


  • 응용 프로그램이 지원할 수 있는 동시 WebSocket 연결 수
  • 애플리케이션이 실패를 처리하는 방법
  • 현재 인프라가 예상 로드에 충분한 지 확인합니다.
  • 시스템과 안정성 및 성능에 대한 확신을 제공합니다.
  • 스택의 구성 요소가 저하 되어도 보안 상태가 저하되지 않도록 합니다.