1. 들어가며


선착순 시나리오는 일반적인 커머스의 조회 위주 트래픽과는 결이 다르다.

2. 부하 테스트 설계: k6 Spike Test


시스템의 한계를 확인하기 위해 k6를 활용한 Spike Test를 설계했다.

// 테스트 시나리오 (Spike Test)
export const options = {
    scenarios: {
        // 시나리오 A: 워밍업 (JIT 컴파일러 예열)
        warm_up: {
            executor: 'constant-vus',
            vus: 10,
            duration: '30s',
            startTime: '0s',
            gracefulStop: '5s',
        },
        // 시나리오 B: 선착순 오픈 (Spike)
        // t3.small 1대가 감당할 극한의 상황을 가정
        spike: {
            executor: 'ramping-vus',
            startTime: '35s', // 워밍업 후 실행
            startVUs: 0,
            stages: [
                { target: 300, duration: '5s' }, // [오픈 직전] 5초 만에 300 VU 투입
                { target: 300, duration: '2m' }, // [오픈 중] 2분간 폭주 상태 유지 -> 병목 지점 확인)
                { target: 0, duration: '10s' }, // [종료] 빠르게 빠짐
            ],
            gracefulRampDown: '10s',
        },
    },

    thresholds: {
        'http_req_failed': ['rate<0.01'], // 에러율 1% 미만
        'http_req_duration': ['p(95)<1000'], // Redis Cluster 감안하여 1초 이내
    },
};

export default function () {
    const uniqueId = exec.scenario.iterationInTest; // 유니크 유저 생성
    const memberNo = (uniqueId % 20000) + 1; // 동시성 이슈 강화

    const payload = JSON.stringify({
        productNo: 1,
        count: 1,
    });

    const params = {
        headers: { 'Content-Type': 'application/json' },
        tags: { name: 'Hot_Order' }
    };

    // 요청 수행
    const res = http.post(`${BASE_URL}/api/v1/orders?memberNo=${memberNo}`, payload, params);
    
    // 부수적인 코드...
}

3. 지표 분석