외부 연동과 트랜잭션 처리
- DB 연동과 외부 연동을 함께 할때는, 오류 발생 시 DB 트랜잭션을 어떻게 처리할지 잘 판단해야함
- 흔히 발생할 수 있는 2가지 상황
- 외부 연동에 실패했을 때 트랜잭션 롤백
- 외부 연동 성공했지만 DB 연동에 실패해 트랜잭션 롤백
- 외부 연동에 실패시 트랜잭션을 롤백
- 트랜잭션 범위 안에서 외부 연동 실패의 경우, 트랜잭션 롤백이 가능
- 하지만, 읽기 타임아웃이 발생해 트랜잭션이 롤백할 때는 외부 서비스가 실제로는 성공적으로 처리했을 가능성을 고려
- 트랜잭션은 롤백했는데 외부 서비스가 실제 성공시 2가지 방법 중 하나를 검토 하자
- 일정 주기로 두 시스템간 데이터 일치 확인해보고 보장
- 예를들어 주문 서비스, 포인트 서비스가 하루에 한 번씩 전날 포인트 사용내역을 비교해 불일치가 있는지 확인 방식
- 성공 확인 API 호출
- 읽기 타임아웃이 발생한경우 일정 시간 후에 이전 호출이 실제로 성공했는지 확인하는 API를 호출
- 이때 성공 응답이 오면 트랜잭션 지속하고 아니면 롤백
- 아니면 아예, 읽기 타임아웃 발생하면 일정 시간뒤 그냥 무조건 취소 API를 호출. 트랜잭션은 그냥 롤백하면됨
- DB연동 관련 실패시 취소 API를 호출한다. 되돌리는 방법을 떠올리는 식으로 해결되는 듯