비동기 연동, 언제 어떻게 써야할까?

동기 연동과 비동기 연동

  • 수행 단계에 따른 동기식 로직 구성
    • 동기식은 직관적임
    • 중간에 실패하면?
    • 동기식 수행에서 외부 연동을 만나는경우
      • 해당 연동 실패가 전체 실패인지 판단할 필요가 있음
      • 전체 실패가 아닌경우 실패해도 기존 로직을 정상수행 해야함
  • 응답시간
  • 비동기 방식으로 연동하는것을 고려해볼 필요가 있음
  • 일시적으로 문제가 발생해도 기존 동작에 영향이 없어야함
    • 약간의 시차 허용
    • 실패시 재시도 가능
    • 연동 실패시 이후 수동으로 처리 가능
    • 연동실패시 무시해도 됨
  • 5가지 비동기 방식에 대해서 살펴봄
    • 별도 스레드로 실행
    • 메시징 시스템 이용하기
    • 트랜잭션 아웃박스 패턴 사용하기
    • 배치로 연동하기
    • CDC 이용하기

별도 스레드로 실행하기

  • 매번 스레드를 생성, 또는 스레드 풀을 사용
  • 비동기 코드는 Catch에서 잡히지 않음
    • 비동기 코드 내에서 직접 오류 처리 필요
  • 자바에서 비동기로 수행할 코드가 외부 API 호출용이면 가상 스레드를 사용하는것을 고려해볼 수 있음

메시징

  • 메시징 시스템을 사용하면 직접 연동하는것에 비해 구조는 복잡해지지만 다음과 같은 이점을 얻을 수 있음
    • 두 시스템이 서로 영향을 주지 않음
    • 확장에 용이함, 예로들면 A -> B에서 A -> C 추가
  • 카프카 / 래빗MQ / 레디스 pub/sub 비교

메시지 생성 측 고려 사항

  • 트랜잭션과 메시징

메시지 소비 측 고려 사항

  • 상황에 따라 동일한 메시지를 중복해서 처리할 수 있음

메시지 종류: 이벤트와 커맨드

  • 이벤트: 어떤일이 발생했음을 알려주는 메시지
    • 주문함
    • 로그인에 실패함
    • 상품 정보를 조회함
    • 배송을 완료함
  • 커맨드: 무언가를 요청하는 메시지
    • 포인트 지급하기
    • 로그인 차단하기
    • 배송 완료 문자 발송하기
  • eventual consistency

트랜잭션 아웃박스 패턴

  • 메시지가 유실되지 않도록 DB에 저장, 이후 저장된 메시지를 읽어 메시징 시스템에 전송하는 패턴

배치 전송

  • 데이터를 비동기로 연동하는 가장 전통적인 방식
  • 메시징이 실시간이라면 배치는 일정 간격으로 데이터를 처리

CDC(Change Data Capture)

  • 변경된 데이터를 추적해서 연동하는 방법