외부 연동이 느려질 때 DB 커넥션풀 문제
- DB 트랜잭션 범위 안에서 외부 연동을 수행할 때 트랜잭션 처리 외에도 주의해야 할 점이 있음
- 바로 외부 연동이 느려지며 생기는 커넥션 풀 부족 현상
- 예를 들어, 기능 실행에 5초가 걸리는 상황을 생각해보자
- 커넥션 풀에서 커넥션 가져온다.
- 0.1초 걸리는 DB 쿼리 실행.
- 외부 연동 API 호출(API 실행해 4.8초 소요)
- 0.1초 걸리는 DB 쿼리 실행
- 커넥션 풀에 반환
- 위 시나리오에서 외부 연동 제외하면, 실제 DB 커넥션이 사용되는 시간은 0.2초에 불과
- 하지만 외부 연동에 4.8초 걸리면서 커넥션은 총 5초 동안 사용상태로 있게됨
- 즉, DB 쿼리를 실행하지 않아도 커넥션이 점유된 상태가 지속되는 것...
- DB 처리 시간은 동일한데 단지 외부연동이 길어졌다느 이유로 커넥션 풀이 포화되는 문제가 발생할수 있다!
- DB연동과 무관히 외부 연동 실행할 수 있다면, DB 커넥션 사용 전이나 후에 외부 연동 시도하는 방안 고려할 수 있다
- 단, 이 방식은 외부 연동이 트랜잭션 범위 밖에 있기에 트랜잭션 커밋 이후 외부 연동이 실패하면 롤백이 불가하다는 점 고려해야함
- 이 경우 실패한 외부 연동에 대한 후처리 반드시 고려
- 후처리 방법으로는 트랜잭션으로 반영된 데이터를 되돌리는 '보상 트랜잭션' 이용 또는 기능 특성에 따라 '데이터 후보정' 등이 있다