게임 서버 GameAnvil의 database 대기 병목을 줄이려 Java에서 MySQL 쿼리를 비동기로 전환한 R&D와 벤치마크를 공유한다. 동기 쿼리가 여유 CPU를 두고도 logic을 멈춰 TPS를 낮추는 문제에서 출발한다.
핵심 포인트- Connection·thread pool을 늘리는 동기식 해법은 두 pool 크기를 맞춰야 하고 물리 자원 한계로 무한 확장이 안 돼, 쿼리를 보낸 뒤 다른 일을 하고 필요할 때 결과를 받는 비동기 처리를 근본 대안으로 검토
- 공식 X DevAPI는 session 1개에선 정상이나 10개에선 약 87%로 성능이 떨어지고, 소스 추적 결과 message callback과 dispatcher loop가 같은 dispatchingThreadMonitor에 매번 lock을 걸어 경합하는 code path를 원인으로 지목
- Netty 기반 jasync-SQL은 NoSQL 기능·최신 인증은 없지만 session 증가에도 lock 문제 없이 동작하고 검증된 레퍼런스가 많아, 기능보다 실제 workload의 안정성·throughput을 우선해 선택
- 23대 VM·최대 4만 동접 테스트에서 2만4천 구간 jasync-SQL이 MyBatis 대비 약 2배 TPS를 기록하고, stored procedure로 트랜잭션을 묶어 비동기 API의 여러 round trip을 성능 감소 약 10% 수준으로 제한
왜 읽나DB 대기가 병목인 고동접 Java 서버에서 비동기 드라이버를 도입하며 드라이버별 lock 특성과 트랜잭션 round trip 함정을 실측으로 판단하려는 개발자에게.