💻문제점
흠 여러 명이 후원하는 것에 대해 K6로 성능 테스트를 하려고 했는데 401 오류가 떴다. token이 필요한 API라 access_token을 요청 헤더에 넣어주긴 해야하는데... k6 테스트할 때에는 어떻게 하지?
우선 k6의 라이프 사이클에 대해 알아보면, 크게 4가지 라이프 사이클이 있다.
각 단계에 대한 설명은 여기를 참고
// 1. init code
export function setup() {
// 2. setup code
}
export default function (data) {
// 3. VU code
}
export function teardown(data) {
// 4. teardown code
}
토큰은 3단계 시나리오를 실행하기 전에 2단계에서 설정을 해주어야 할 것 같다.
🔍해결
계속 로그인해서 토큰을 응답 헤더에서 가져오는 부분이 문제가 있었는데, 요청 url이 http가 아니라 https 여서 안 됐던 것이었다...ㅠㅠ 깨달으면 비로소 보이는 것....,,,,,, 이 외에도 이런저런 문제가 있었지만,, 블로그 적는 걸 까먹어서 지금은 다 날아갔다.
그리고 계속 테스트가 fail이 뜨길래 뭐가 문제지 했더니 test6한테 충분한 포인트가 없어서..ㅎㅎ
test6에게 2백만 포인트를 넣어주고, test7에게 후원하는 걸로 테스트를 수행했다.
import http from 'k6/http';
import {sleep, check} from 'k6';
import {Trend} from "k6/metrics";
export const options = {
vus: 50, //가상 사용자 수
duration: '20s'
};
const USERID = `test6`;
const PASSWORD = '1234';
const BASE_URL = '요청 url';
const signup = {
userId: USERID,
password: PASSWORD,
nickname: USERID
};
const login = {
userId: USERID,
password: PASSWORD,
};
export function setup() {
const loginRes = http.post(`${BASE_URL}/members/login`, JSON.stringify(login), {
headers: {
'Content-Type': 'application/json'
}
});
const authToken = loginRes.headers['Access_token'];
check(authToken, {'login in successfully': () => authToken !== ''});
return authToken;
}
const payload = {
streamer: 'forTest7',
points: 100,
message: 'testMessage',
};
const myTrend = new Trend('response time') //커스텀 메트릭
export default (authToken) => {
const res = http.post(`${BASE_URL}/points/spend`, JSON.stringify(payload), {
headers: {
Access_Token: `${authToken}`,
'Content-Type': 'application/json'
},
});
myTrend.add(res.timings.duration); //커스텀 메트릭
check(res, {"scenario status is 200": (res) => res.status === 200});
sleep(1);
};
총 요청은 (로그인 요청 + 후원 요청) 이다. 1001번 이니까, 후원 요청은 1000번 수행되고, 100 포인트씩 후원했으므로 test7은 십만 포인트를 가져야한다. 과연 db도 잘 반영됐을지?
동시성 문제 없이 잘 반영이 되었다..!
test6은 현재 가상 사용자를 이용해서 모든 사용자들이 test6의 로우를 수정하다보니 동시성 문제가 있는데, 실제 서비스에서는 자기 자신밖에 수정하지 못하기 때문에 문제는 없을 것 같다...!
이번에는 가상 사용자 3000명, duration은 30s로 설정했다.
근데 생각해보니,, 3천명이 동시에 후원할 일은 현실에서 드물 것 같다...
조금 더 현실적인 수를 생각해보자면 300~500명 정도?
내일 Grafana도 켜서 확인해봐야겠다.
'TIL' 카테고리의 다른 글
[TIL - 20230628] 후원 비관적 락 -> Redis 분산 락 변경 (동시성) (0) | 2023.06.29 |
---|---|
[TIL - 20230623] rsocket 채팅창에 후원 내역 띄우기 (0) | 2023.06.24 |
[TIL - 20230621] Webflux R2DBC 후원 동시성 문제 해결 (0) | 2023.06.22 |
[TIL - 20230620] Webflux CORS (0) | 2023.06.21 |
[TIL - 20230616] (0) | 2023.06.17 |