1. 프로젝트 진행 상황 및 계획
🥇 비관적 락 사용하기 (완료)
🥈 낙관적 락 사용하기 (완료)
🥉 분산 락 구현하기 (진행 중, 25.02.06 완료 목표)
4️⃣ 분산 락 구현 이후 테스트 코드 실행하기 (진행 전, 25.02.06 완료 목표)
5️⃣ 동시성 제어 관련 공부하기 (진행 중, 25.02.06 완료 목표)
2. 삽질로 하루를 허비했다.
(1) 스레드 20개, 입찰 요청 1,000건일 때 ▼
(2) 스레드 20개, 입찰 요청 500건일 때 ▼
(3) 스레드 20개, 입찰 요청 249건일 때 ▼
비관적 락(pessimistic lock)이나 낙관적 락(optimistic lock)을 적용했을 때 동시성이 잘 제어되는지를 보려고 테스트 코드를 작성하고 여러 번 실행했는데, 너무 '성능 개선'에 꽂힌 탓이었을까? 입찰 요청 수를 1,000건으로 늘렸을 때 오류가 발생해서 스레드(thread)가 20개일 때 예상 밖 예외가 발생하지 않는지 여러 번 찾아다녔다. 테스트 코드의 목적을 잊은 줄도 모르고 몇 번씩 실행하고 걸린 시간이며 여러 값을 확인하느라 시간 가는 줄을 몰랐다.
한 마디로 삽질하느라 하루를 허비하고 말았다.
동시성이 잘 제어되는지 확인하려면 테스트 코드 대신 실제 환경과 유사한 조건에서 검증해야 하는데, 아침이고 점심이고 스레드 수를 고정한 채 요청 수만 바꿔가며 테스트에 몰두했다. 개인 환경에서 검증하면 네트워크라든지 컴퓨터 사양 같은 요소 때문에 값의 정확성이 떨어지는 줄도 모르고.
프로젝트 마감이 겨우 이틀밖에 남지 않은 와중에 예상 밖 예외 메시지를 분석했다. 스레드가 20개이고 입찰 요청이 500건인 두 번째 상황에서 나온 수치를 참 열심히도 해석했다.
ⓐ 입찰 요청 총 개수: 500개
ⓑ 발생한 예상 안 예외 총 개수: 17개
ⓒ 성공해야 하는 요청 총 개수: 483개 (ⓐ - ⓑ)
ⓓ 실제로 성공한 요청 총 개수: 480개
ⓔ 테스트 코드 실행 시 발생한 예상 밖 예외 총 개수: 3개. 'ⓒ - ⓓ' 값과 동일하다.
Exception in thread "pool-2-thread-28"
CannotCreateTransactionException:
Could not open JPA EntityManager for transaction
// (1) HikariCP:
// - 데이터베이스와의 된 연결을 관리하는 커넥션 풀
// - 일정 수의 연결을 동시에 처리 가능
// (2) 예외 발생
// - 위치: HikariCP의 스레드 풀 내에서 실행 중인 28번 스레드
// - 내용: 트랜잭션을 처리하려는 스레드에서 JPA EntityManager를 열 수 없음
Caused by: JDBCConnectionException:
Unable to acquire JDBC Connection
[HikariPool-1 - Connection is not available,
request timed out after 30004ms
(total=20, active=20, idle=0, waiting=0)]
// 원인: JDBC 연결을 얻을 수 없음
// HikariCP에서 연결 풀에서 30초 동안 연결을 얻지 못함
Caused by: java.sql.SQLTransientConnectionException:
HikariPool-1 - Connection is not available,
request timed out after 30004ms
(total=20, active=20, idle=0, waiting=0)
// 세부 원인: HikariCP 연결 풀에서 타임아웃 발생
// 풀에 활성 연결이 모두 사용 중이고 대기 중인 연결이 없음
// HikariPool-1에서 활성 연결이 20개가 모두 사용 중이고,
// 대기 중인 연결이 0개라서,
// 새로운 요청이 연결을 얻지 못하고 타임아웃 오류 발생
우선 남은 기간에는 분산 락 적용과 글 정리에 집중해야겠다. 오늘은 밤에 되기가 무섭게 눈꺼풀이 바로 감길 만큼, 긴장이 탁 풀어진 듯한 느낌이 들 정도로 피곤했다.
'끝을 보는 용기' 카테고리의 다른 글
Day 123 - 프로젝트 마감 중 (02.08 작성한 테스트 코드 업로드 예정) (0) | 2025.02.06 |
---|---|
Day 121 - 게임 아이템 거래소 프로젝트 55%, 한 사용자가 연속으로 입찰하지 못하도록 막아야 할까? (0) | 2025.02.04 |
Day 120 - 게임 아이템 거래소 프로젝트 45%, 자물쇠를 걸기도 전에 데드락(Deadlock)이 발생했을 때 심정이란 (0) | 2025.02.03 |
Day 119 - 게임 아이템 거래소 프로젝트 35%, 낙낙(Knock Knock) 대신 락락(Lock Lock), 제대로 골머리 앓는 중 (0) | 2025.02.02 |
Day 118 - 게임 아이템 거래소 프로젝트 25%, 코드 한 줄 쓸 때마다 '지금이 최선일까?' 고민하다 (0) | 2025.02.01 |