외부 연동과 트랜잭션 처리

  • DB 연동과 외부 연동을 함께 할때는, 오류 발생 시 DB 트랜잭션을 어떻게 처리할지 잘 판단해야함
  • 흔히 발생할 수 있는 2가지 상황
    • 외부 연동에 실패했을 때 트랜잭션 롤백
    • 외부 연동 성공했지만 DB 연동에 실패해 트랜잭션 롤백

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

  • DB연동 관련 실패시 취소 API를 호출한다. 되돌리는 방법을 떠올리는 식으로 해결되는 듯