본문 바로가기

MSA 구조에서 생각해야 할 API단 로직

MSA 구조에서 생각해야 할 API단 로직

프로젝트를 하다 보면 다양한 프로젝트 구조가 있다.

그 중에서 MSA(마이크로 서비스 아키텍처) 구조가 있는데 MSA 구조는 개발할 서비스를 분업화하기 위해 모듈로 나눠서 개발을 진행하는 구조를 말한다.

쇼핑몰로 예를 들면 주문 / 회원 / 상품이 각각의 모듈이 되고 모듈별로 하나의 프로젝트를 구성하고 DB도 분리되어 개발을 진행한다.

기존에 통합으로 프로젝트를 관리하여 진행한 것이 통상적이었는데 MSA 구조로 개발을 하게 되면 꽤나 불편했다.

(물론 MSA만의 장점도 있기에 MSA 구조도 쓰이는 것이라고 생각한다.)

가장 불편했던 것은 복합적 데이터 추출인데 DB의 조인은 타 모듈간 사용할 수 없다.

API단에서 타 모듈 API를 호출하고 호출해서 받아온 데이터를 다시 재구성해야 했다.


물론 빅데이터로 데이터를 추출해야 하는 경우에는 따로 DB를 구성하여 그 쪽에서 쿼리를 호출하여 불러오는 방식이 있다.

(단 빅데이터 DB에 데이터가 있으려면 일정 간격으로 각 모듈 DB에서 최신화 시켜주는 배치 작업이 필요하다.)


서론이 길었는데 기초적이면서도 MSA 구조라서 더욱 오류가 잘 나타났던 기억을 기록하고자 한다.


API 로직은 다음과 같다.

1. A모듈에서 시작하여 

2. B모듈 API를 호출하고

3. B모듈 API 처리가 성공이면 

4. B모듈의 DATA 조건을 확인하여 

5. 조건이 TRUE이면 A모듈의 DB에 접근하여 DATA를 수정한다.

6. A모듈의 결과를 리턴한다.


최초의 호출 방식은 다음과 같았다.

1. A모듈에서 B모듈을 호출하고 B모듈에서도 A모듈을 호출하게 로직을 짜서 최종 결과를 B모듈에서 A모듈에게 최종 결과를 리턴하게끔 로직을 구성하였다.

결과는 100% 처리 오류로 떨어졌고 내용은 QueryTimeoutException이 발생하였다. 

B모듈에서 A 모듈로 API 호출중에 B모듈도 DB 접근을 하면서 충돌이 발생하여 해당 Exception이 발생했다는 것이 추측이다.


그래서 B모듈에서 A모듈로 호출하는 부분을 제거하고 A모듈에서 B모듈을 한 번 더 호출하게 바꿔보았다.

2. B모듈에서 최초의 프로세스를 처리하고 결과와 상관없이 B모듈을 한 번 더 호출하여 A모듈 처리 확인 API 를 호출한다. B모듈의 처리 여부 결과 값에 따라 A모듈 DATA를 처리하고 최종 결과를 리턴하게끔 로직을 구성하였다.

결과는 5% 빈도로 A모듈 DATA UPDATE가 발생하지 않았다.


따로 오류 익셉션은 발생하지 않아서 그야말로 미궁에 빠졌고 한 번 더 고민했다.

3. B모듈에서 최초의 프로세스를 처리하고 A모듈 처리 여부 결과 값을 A모듈에 리턴한다. B모듈 리턴값을 확인하여 A모듈 DATA를 처리하고 최종 결과를 리턴하게끔 로직을 구성하였다.

결과는 A모듈에 DATA UPDATE가 결과 값에 따라 처리되었다.


이번 MSA 구조 프로젝트를 진행하면서 가장 크게 느낀 것은 타 모듈 API 호출을 오용 남용하면 생각지도 못했던 오류가 발생하는 것을 알았다. 

비록 MSA 구조가 아니더라도 상호간의 API 호출은 최대한 서로 무리가 가지 않게 소스를 짜는 것이 올바른 방식이라는 것을 다시 한 번 느꼈다.


반응형
그리드형