source 는 Github 에 있습니다.
목차는 상품 주문 에 있습니다.
[상품 주문 4편] 동시성 테스트
Webflux, 코틀린, Redis, 분산락 공부를 위해 작성했습니다.
테스트 데이터
- 데이터를 아래와 같이 미리 만들었습니다. (Spring - schema.sql)
- Application 이 실행될 때, 아래 데이터가 INSERT 됩니다.
- id 는 productId, name 은 product_name, stock 은 재고입니다.
insert into product (id, name, stock)
values
('product1001', 'Product A', 1000),
('product1002', 'Product B', 2000),
('product1003', 'Product C', 3000),
('product1004', 'Product D', 4000),
('product1005', 'Product E', 5000);
K6 스크립트
- 동시 유저 5명에 USER_ID 는 user1~5 로 설정했습니다.
- PRODUCT_ID 는 product1001~1005 로 테스트 했습니다.
- 한 번에 주문 개수는 10개입니다.
import http from 'k6/http';
const BASE_URL = 'http://localhost:8080';
const USER_COUNT = 5;
const PRODUCT_IDS = ['product1001', 'product1002', 'product1003', 'product1004', 'product1005'];
export const options = {
vus: USER_COUNT,
duration: '20s',
};
export default function () {
const userId = 'user' + __VU;
const productId = PRODUCT_IDS[__VU % PRODUCT_IDS.length];
const quantity = 10;
const payload = JSON.stringify({
userId: userId,
productId: productId,
quantity: quantity,
});
const url = `${BASE_URL}/api/v1/orders`;
const headers = { 'Content-Type': 'application/json' };
const response = http.post(url, payload, { headers: headers });
if (response.status !== 200) {
console.error(`Error for ${userId} - ${productId}: ${response.status} - ${response.body}`);
}
}
- k6 스크립트를 실행하고 설치하는 방법은 내용이 길어 포함시키지 않았습니다.
- 실행하는 방법은
k6 run xxx.js
입니다.
테스트 결과
- PRODUCT1001 ~ PRODUCT1005 의 총재고는 15000 개 입니다. 10개씩 주문했으니 주문은 1500 개가 만들어지는게 맞습니다.
- PRODUCT 테이블을 조회해서 재고를 확인해보니 전부 0인 것도 맞습니다.