01. Artillery
- 개발자가 애플리케이션을 효과적으로 테스트할 수 있는 오픈 소스 라이브러리
- HTTP, Socket.io, Websocket, gRPC 등 다양한 프로토콜 지원
- 클라우드 규모에서의 테스트 가능 (AWS Lambda 서버리스 로드 테스트)
- HTML, JSON 등 가독성이 좋은 처리량 및 통계 제공
- 시나리오 단위로 테스트 가능
02. 부하 테스트
- 서버가 얼마만큼의 요청을 견딜 수 있는지 테스트하는 방법
- 서버가 몇 명의 동시 접속자나 일일 사용자를 수용할 수 있는지 예측하는 것은 매우 어렵다. 작성한 코드에 문제가 없더라도 서버의 하드웨어 제약으로 인해 서비스가 중단될 수 있다.
- OOM(out of memory):서버가 접속자들의 정보 저장을 위해 각 사용자마다 일정한 메모리를 할당할 때, 메모리의 양이 계속 즉가하다가 결국 서버의 메모리 용량을 넘어서게 되면 발생하는 문제
- 사용하는 언어, 프레임워크에 따라 사용하는 라이브러리가 다른데 Node.js 환경에서는 Artillery를 주로 사용한다.
03. 사용하기
npm i -D artillery
==> 꼭 서버 코드를 작성한 폴더나 개발 중에 있는 폴더에 라이브러리를 설치할 필요는 없다. 따로 폴더를 생성한 후에 artillery를 설치하고 시나리오를 통해 테스트를 진행해도 된다.
(1) 실제 서버에서 테스트
- 같은 환경에서 진행하는 경우
npx artillery quick --count 100 -n 50 {서버 주소}
- 서버주소에 빠르게 부하 테스트를 진행
1. --count : 가상의 사용자 수
2. -n : 요청 횟수
3. --rate : 초당 요청
==> 100명의 가상 사용자가 50번의 요청을 보낸 것. 따라서 5000번의 요청이 서버로 전달. - 실제 서비스를 부하 테스트할 때는 과금에 대해서 주의해야한다.
(2) 시나리오 테스트
- 부하 테스트를 할 때 단순히 한 페이지에만 요청을 보내는 것이 아니라 실제 사용자의 행동을 모방하여 시나리오를 작성
- JSON 또는 YAML형식의 설정 파일을 작성해야 한다.
- test.json
{
"config": {
"target": "http://localhost:8001",
"phases": [
{
"duration": 60,
"arrivalRate": 30
}
]
},
"scenarios": [
{
"flow": [
{
"get": {
"url": "/"
}
},
{
"post": {
"url": "/auth/login",
"json": {
"email": "test1@test.com",
"password": "123123"
}
}
},
{
"get": {
"url": "/hashtag?hashtag=test"
}
}
]
}
]
}
- Config
1. target : 테스트할 서버 주소
2. phases : 테스트 요청 시간과 비율
==> {"duration": 60, " arrivalRate": 30} : 60초 동안 매초 30개의 요청을 보낸다.
3. defaults : 시나리오의 기본값을 설정
4. payload: 임의의 데이터를 보내기 위해서 사용.
5. socket.io : 소켓 테스트
==> query : socket 들이 들어오는 주소 끝에 roomId로 쿼리를 달고 있어서 쿼리 부분을 작성해줘야 한다.
6. plugins : 플로그인 설정 - tls: configure how Artillery handles self-signed certificates
7. ensure : 에러나 지연시간에 대해 성공 조건을 셋팅
8. processor : 커스텀 js 코드를 load한다. - Secnarios
1. name : 시나리오 이름
2. flow : 시나리오에서 진행하는 테스트 동작을 순서대로 작성
3. capture : 응답으로 받은 데이터에서 다시 변수로 지정해서 뒤에 보내는 요청에 사용
4. match : 응답 데이터가 원하는 값이 오는지를 확인할 수 있다.
5. weight : 시나리오에 대한 가중치. 값이 높으면 해당 시나리오는 더 많이 발생한다.
npx artillery run loadtest.json
==> 결과는 터미널에 기록된다.
(3) 실제 사용
- loadtest.json
{
"config": {
"target": "http://localhost:3000",
"phases": [
{
"duration": 60,
"arrivalRate": 30
}
]
},
"scenarios": [
{
"flow": [
{
"get": {
"url": "/boat/map"
}
}
]
}
]
}
==> 한가지만 실시했다.
- 웹에서 그래프 분석
npx artillery run -o myReport loadtest.json
==> myReport는 파일 명이므로 바꿔도 된다.
npx artillery report myReport
==> 웹으로 변환하는 작업 (myReport.html이 생성된다.)
- 코드 개선 전
- 코드 개선 후
==> 이렇게 artillery 스트레스 테스트를 통해 개선 점을 수치로 파악하기 쉽고 개선 사항을 빠르게 개선할 수 있다.
'JavaScript Dev. > Node.js' 카테고리의 다른 글
Helmet 모듈이란?? (0) | 2023.07.21 |
---|---|
JWT 토큰 보안을 강화하기.... (0) | 2023.07.21 |
node-cron란?? (feat. cron) (0) | 2023.06.21 |
카카오 소셜 로그인(feat. passport-kakao, jwt) (0) | 2023.06.12 |
AWS EC2를 이용해 HTTPS 배포 (feat. 가비아) (2) | 2023.06.02 |