동기 연동과 비동기 연동
- 수행 단계에 따른 동기식 로직 구성
- 동기식은 직관적임
- 중간에 실패하면?
- 동기식 수행에서 외부 연동을 만나는경우
- 해당 연동 실패가 전체 실패인지 판단할 필요가 있음
- 전체 실패가 아닌경우 실패해도 기존 로직을 정상수행 해야함
- 응답시간
- 비동기 방식으로 연동하는것을 고려해볼 필요가 있음
- 일시적으로 문제가 발생해도 기존 동작에 영향이 없어야함
- 약간의 시차 허용
- 실패시 재시도 가능
- 연동 실패시 이후 수동으로 처리 가능
- 연동실패시 무시해도 됨
- 5가지 비동기 방식에 대해서 살펴봄
- 별도 스레드로 실행
- 메시징 시스템 이용하기
- 트랜잭션 아웃박스 패턴 사용하기
- 배치로 연동하기
- CDC 이용하기
별도 스레드로 실행하기
- 매번 스레드를 생성, 또는 스레드 풀을 사용
- 비동기 코드는 Catch에서 잡히지 않음
- 자바에서 비동기로 수행할 코드가 외부 API 호출용이면 가상 스레드를 사용하는것을 고려해볼 수 있음
메시징
- 메시징 시스템을 사용하면 직접 연동하는것에 비해 구조는 복잡해지지만 다음과 같은 이점을 얻을 수 있음
- 두 시스템이 서로 영향을 주지 않음
- 확장에 용이함, 예로들면 A -> B에서 A -> C 추가
- 카프카 / 래빗MQ / 레디스 pub/sub 비교
메시지 생성 측 고려 사항
메시지 소비 측 고려 사항
- 상황에 따라 동일한 메시지를 중복해서 처리할 수 있음
메시지 종류: 이벤트와 커맨드
- 이벤트: 어떤일이 발생했음을 알려주는 메시지
- 주문함
- 로그인에 실패함
- 상품 정보를 조회함
- 배송을 완료함
- 커맨드: 무언가를 요청하는 메시지
- 포인트 지급하기
- 로그인 차단하기
- 배송 완료 문자 발송하기
- eventual consistency
트랜잭션 아웃박스 패턴
- 메시지가 유실되지 않도록 DB에 저장, 이후 저장된 메시지를 읽어 메시징 시스템에 전송하는 패턴
배치 전송
- 데이터를 비동기로 연동하는 가장 전통적인 방식
- 메시징이 실시간이라면 배치는 일정 간격으로 데이터를 처리
CDC(Change Data Capture)