이번주 이슈
2023. 11. 16. 08:45ㆍ카테고리 없음
1. 검수자 배정 시, 트랜잭션 타임아웃 발생.
해당 상품은 연재 상품으로 마더와 차일드 관계로 이뤄짐.
500회차가 넘는 연재 상품.
로그를 보니 실행 쿼리가 2000회가 넘어가다가 뻗었다. 개별 쿼리 실행 속도가 길진 않았지만 워낙 많은 쿼리가 실행되다보니 트랜잭션 최대 시간인 30초를 초과하였다.
왜 이렇게 쿼리가 많이 실행되는지 이전 히스토리들을 보았는데 1000개를 넘는 경우가 간혹 있긴 했지만 수백개 내에서 실행되었다.
소스를 분석했다. 차일드 상품마다 반복문을 순회하며 쿼리를 실행하고 있었다. 반복문으로 회차마다 개별적으로 insert, update 등이 실행되다보니 500 * n번 실행된 것이다.
검수자를 배정할 때, 대개 많아봤자 100개 정도의 회차 정도가 최대였기에 그간 문제가 없었던 듯 하다.
비즈니스 로직을 보니 사실 검수자 배정시에 마더의 회차들을 개별적으로 반복문으로 쿼리를 실행할 필요가 없었다. 마더별로 한번에 처리가 가능하도록 수정했다.
검수자 배정 API는 마더 상품을 여러 개 받을 수 있었기 때문에 더 큰 위험이 도사리고 있었다..
물론 한 명의 MD가 연재 상품을 한 번에 100개씩 배정할 일이 없긴 하다만, 만약 100개의 회차(차일드)를 가진 연재 상품(마더) 100개를 검수배정했다면, 10000 * n번 실행되는 구조였다..