부하 테스트 예로 내가 어떤 게임 서버를 만들었는데 아마도 유저가 최대 얼마 정도 접속 해서 API를
호출 하지 않을까? 예상해서 가상의 유저를 생성하여 API를 계속 호출해서 서버가 어떤 상태가
되는지 확인을 하는 것을 부하 테스트라 이해 했다.
부하 테스트를 통해 현재 이 서비스의 서버 사양이 괜찮은지, 어플리케이션이 점점 느려진다는지
등등 이러한 부분을 체크 하여 수정 및 개선을 한다.
실제로 온라인 게임등을 보면 종종 오픈 시 서버가 터지는데 얼마나 몰린건지.. 무섭다
Artillery Artillery는 Node.js에서 쓸 수 있는 부하 테스트 도구 인데 아래와 같은 방법을 지원 한다.
다른 부하 테스트 도구를 아직 안 써봐서 장점이나 단점은 잘 모르겠다..
설치 node.js가 설치되어 있어야 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 npm i artillery -g artillery -V
연습할 어플리케이션 아주 간단한 API를 Express로 작성
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 const express = require ('express' );const bodyParser = require ('body-parser' );const uuid = require ('nanoid' );const app = express();app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true , })); const port = 3000 ;app.post('/join' , (req, res ) => { return res.json({ code : 200 , id : uuid.nanoid(), create_at : new Date ().getTime() }); }); app.get('/data' , (req, res ) => { const { id } = req.query; if (!id) { return res.json({ code : 500 , message : 'something wrong' }); } return res.json({ code : 200 , id }); }); app.listen(port, (req, res ) => { console .log(`running on port ${port} ` ); });
시나리오 시나리오를 작성한대로 API를 여러 번 호출을 하여 부하를 줄 수가 있다.
지금은 연습으로 HTTP 테스트 시나리오를 작성 한다.
/join을 통해 ID를 응답 받는다.
/data에 ID를 보낸다.
artillery는 json 또는 yaml을 지원하는데 yaml이 나은 듯(주석을 쓸 수 있어서!)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 config: target: "http://localhost:3000" phases: - duration: 30 arrivalRate: 300 processor: "./util.js" defaults: headers: Content-Type: 'application/json' scenarios: - flow: - post: url: "/join" body: "" afterResponse: "responseData" match: json: "$.code" value: 200 - function: "setParam" - get: url: "/data?id={{ id }} " match: json: "$.code" value: 200
이전엔 몰랏는데 함수를 시나리오 로직에 추가할 수가 있었다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 const fs = require ('fs' );const data = [];const responseData = (requestParams, response, context, ee, next ) => { const json = JSON .parse(response.body); if (json.code === 200 ) { data.push(json.id); } return next(); }; let i = 0 ;const setParam = (context, events, done ) => { context.vars['id' ] = data[i]; i++; return done(); } exports .responseData = responseData;exports .setParam = setParam;
실행 및 결과 1 2 artillery run -o 결과.json 실행할 파일명.yaml artillery report 결과.json
작성한 yaml파일의 실행 결과를 json으로 저장을 한다.
report 명령어로 실행을 하면 html로 차트 등 결과 화면을 보여 준다.
참고