외부 연동이 느려질 때 DB 커넥션풀 문제

  • DB 트랜잭션 범위 안에서 외부 연동을 수행할 때 트랜잭션 처리 외에도 주의해야 할 점이 있음
  • 바로 외부 연동이 느려지며 생기는 커넥션 풀 부족 현상
  • 예를 들어, 기능 실행에 5초가 걸리는 상황을 생각해보자
  1. 커넥션 풀에서 커넥션 가져온다.
  2. 0.1초 걸리는 DB 쿼리 실행.
  3. 외부 연동 API 호출(API 실행해 4.8초 소요)
  4. 0.1초 걸리는 DB 쿼리 실행
  5. 커넥션 풀에 반환
  • 위 시나리오에서 외부 연동 제외하면, 실제 DB 커넥션이 사용되는 시간은 0.2초에 불과
  • 하지만 외부 연동에 4.8초 걸리면서 커넥션은 총 5초 동안 사용상태로 있게됨
  • 즉, DB 쿼리를 실행하지 않아도 커넥션이 점유된 상태가 지속되는 것...

  • DB 처리 시간은 동일한데 단지 외부연동이 길어졌다느 이유로 커넥션 풀이 포화되는 문제가 발생할수 있다!
  • DB연동과 무관히 외부 연동 실행할 수 있다면, DB 커넥션 사용 전이나 후에 외부 연동 시도하는 방안 고려할 수 있다
    • 단, 이 방식은 외부 연동이 트랜잭션 범위 밖에 있기에 트랜잭션 커밋 이후 외부 연동이 실패하면 롤백이 불가하다는 점 고려해야함
    • 이 경우 실패한 외부 연동에 대한 후처리 반드시 고려
    • 후처리 방법으로는 트랜잭션으로 반영된 데이터를 되돌리는 '보상 트랜잭션' 이용 또는 기능 특성에 따라 '데이터 후보정' 등이 있다