Today I Learned
날짜
2024년 11월 29일 금요일
내용
무한증식 커넥션
그저께, 커넥션 풀 문제가 생겨 한도를 늘려줘서 해결했다. 그런데 갑작스레 오늘 점심 쯤에 같은 오류가 발생했다. 그렇게 유저가 바글바글하지도 않은데 뭐지 싶어 RDS에서 커넥션 풀 그래프를 찾아봤다.

처음 50정도로 늘렸을 때 였다가 그저께 올리자마자 급격히 상승해서 유지됐다. 항상 연결이 많은걸로 보이는데, 피크타임도 없이 그렇다는게 뭔가 납득이 안됐다. RDS에서 어떤 경고(?)가 떠서 확인해보니

유휴 상태로 쓰이지 않는 트랜잭션이 너무 많이 유지되고 있다는 에러다. 유휴 상태는 데이터베이스에 접속해서 현재 유휴 상태인 트랜잭션을 확인했다.
| |
메시지
7390 | instgram_prod | idle in transaction | SELECT instagram_product.id, instagram_product.price, instagram_product.inventory, instagram_product.image_url, instagram_product.origin_id, instagram_product.title, instagram_product.handle, instagram_product.created_at, instagram_product.updated_a +| -02:24:32.972911 | postgres | | | FROM instagram_product +| | | | | WHERE instagram_product.origin_id = ‘1483381637173’ | | 23084 | instgram_prod | idle in transaction | SELECT instagram_product.id, instagram_product.price, instagram_product.inventory, instagram_product.image_url, instagram_product.origin_id, instagram_product.title, instagram_product.handle, instagram_product.created_at, instagram_product.updated_a +| -02:38:05.720898 | postgres | | | FROM instagram_product +| | | | | WHERE instagram_product.origin_id = ‘8073092628733’ | |
작동되는 쿼리를 보니 쇼피파이 상품 수정 웹훅에서 호출되는 것 같다. 실제로 이 문제로 인해 가장 오류가 많이 발생하는 엔드포인트기도 하다. 이런 유휴 상태의 트랜잭션이 70여개가 넘어, 우선 직접 종료해주었다.
| |
맨 위의 사진에서도 보이지만 이 이후 급격하게 내려갔다. 이제 왜 그랬는지를 찾고 재발을 방지해야 하는데..
웹훅이 멀티스레드로 실행되기 때문인 것 같다. 서버에서 요청이 호출될 때 종속성을 이용해 데이터베이스를 호출하고 로직이 끝날때 종료한다. 백그라운드에서 작동하는 로직은 별도의 쓰레드로 처리된다. 따라서 요청에서 주입된 세션이 백그라운드에도 적용될 경우, 트랜잭션이 유휴 상태에 빠질 수 있다고 한다.
이를 방지하기 위해, 백그라운드로 로직을 돌릴땐, 요청의 생명주기와는 독립적으로 세션을 관리하도록 코드를 변경했다.
| |

일단 수동 삭제후 다시 증가하던 트랜잭션이 다시 감소중..
회고
이거.. 맞겠지…?