Tiny Star

프로젝트/쿠폰

[쿠폰] 성능 테스트 및 개선 (JDBC Bulk Insert)

흰둥아 2025. 4. 30. 13:11

 

 

k6 - DB Worker delay

1. 100count /  5s 

k6는 테스트를 진행해서 끝났는데, insert는 계속되는 문제가 발생했다.

현재 로직은 5초마다 최대 100개의 메세지를 처리하도록 되어있는데 이 수치를 조정해서 보완해보려고 한다.

 

 

2. 10,000count / 5s

 

'20분 -> 1분'으로 많이 줄었지만, 그래도 1분 이상 차이가 난다.

아무래도 한번 메세지를 받을 때마다 5초의 딜레이가 있다보니 거기서 나오는 문제로 예상된다.

1초로 바꿔보자.

 

 

3. 10,000count / 1s

이제 1분 안으로 들어왔다.

다만 1초로 줄였음에도 30초가 넘는 차이가 나는게 이상한데, 아무래도 saveAll()이 하나씩 insert 하다보니까 생기는 문제가 아닐까 생각해봤다. Bulk insert가 가능하도록 로직을 보완하고 다시 시도해보자.

 

 

4. 10,000count / 1s / Batch Bulk Insert

Id 방식을 GenerationType.SEQUENCE 로 변경하는 방안이 있다. 

하지만 SEQUENCE 는 auto_increment가 아니라 DB에서 ID 시퀀스를 별도로 관리하고, MySQL에서는 작동을 안한다고 해서 직접 JDBC insert 를 쓰는 방식으로 하기로 했다.

private JdbcTemplate jdbcTemplate;

public void batchInsertCouponIssues(List<CouponIssues> issues) {
    jdbcTemplate.batchUpdate(
            "INSERT INTO coupon_issues (coupon_id, user_id, created_at) VALUES (?, ?, ?)",
            new BatchPreparedStatementSetter() {
                public void setValues(PreparedStatement ps, int i) throws SQLException {
                    CouponIssues issue = issues.get(i);
                    ps.setLong(1, issue.getCoupons().getId());
                    ps.setString(2, issue.getUserId());
                    ps.setTimestamp(3, issue.getCreatedAt());
                }

                public int getBatchSize() {
                    return issues.size();
                }
            }
    );
    log.info("CouponIssues Inserted: {}", issues.size());
}

BatchRepository 생성 후 직접 쿼리를 작성해줬다.

 

1초 차이가 났다!

혹시 1초마다 실행시키지 않더라도 큰 차이가 없게 할 수 있는지도 확인해보고싶다.

 

 

5. 10,000count / 5s / Batch Bulk Insert

28초의 차이를 보였다.

아무래도 5초에 한번씩 쿼리를 하는거나 마찬가지이기 때문에 차이가 생길 수 밖에 없는 것 같다.

하지만 1초씩 saveAll() 했을 때보단 20초나 빠르다.

 

 

분류 k6 insert 차이
1. 100count /  5s  11:40:09 12:00:26 (중간에 중단) 20분 17초
2. 10,000count / 5s 12:04:30 12:05:44 1분 14초
3. 10,000count / 1s 12:09:49 12:10:37 48초
4. 10,000count / 1s / Batch Bulk Insert 12:54:22 12:54:23 1초
5. 10,000count / 5s / Batch Bulk Insert
13:06:57 13:07:25 28초

 

BulkInsert 설정으로 Redis와 DB의 차이를 최대 20분 -> 1초로 줄였다.

실시간성을 유지하기 위해서는 Worker 딜레이를 1초로 설정하는 수밖에 없는 것 같다.

 

 

 

 

 

 

 

top