인프런 커뮤니티 질문&답변

돌로스원숭숭님의 프로필 이미지
돌로스원숭숭

작성한 질문수

[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스

15-02 API-Gateway 2

어느 상황일때, MSA로 나누는 것이 더 좋은 상황인지 구체적으로 궁금합니다.

해결된 질문

작성

·

318

0

auth서버와 resource서버는 서로 통신을 안하게끔 설계하는 것이 좋은가요? 서버끼리 통신할 일이 많아 보이는데, 이러면 Monolitic 방식보다 많이 느려질 것 같아서 말입니다.

 

그리고 authService가 userService를 사용하므로, user에 관련된 것들은 auth 서버에 넣어야 되는 건가요? 아니면 resource에다가 넣어도 되는건가요?

 

그리고 어지간한 서비스는 회원(user) 테이블과 관련이 있을 것 같은데(ex: TableJoin 같은 것 해야할때) , 어느정도로 서비스가 독립적이어야 Monolitic 보다 MSA가 더 나은지 궁금합니다.

 

 

답변 2

2

노원두님의 프로필 이미지
노원두
지식공유자

안녕하세요! 돌로스원숭숭님!

먼저, 모든 경우에 MSA가 좋은 것은 아니예요!
기술들은 항상 장단점 트레이드오프가 있죠!

 

MSA를 선택한다면 서비스간 통신에서 발생하는 지연시간에 대한 성능부분을 일부 내어주는 대신,
독립적인 서비스를 통해 안정성과 확장성을 얻을 수 있을 것 같아요!
여기서 발생되는 성능 문제는 캐시 또는 조회전용 테이블을 구성하는 방식 등으로 극복해 볼 수 있을 것 같아요!

 

인증 처리와 관련하여서는 회사마다 방식이 많이 다른데, gateway에서 처리하는 경우도 많고, gateway 뒷단에 authService 를 두고 여기서 처리하는 경우도 많아요!

인가 처리와 관련하여서도 회사마다 방식이 많이 다른데, gateway에서 인가하고 허가된 요청에 대해서 뒷단으로 넘겨주는 방식도 많이 사용되고, 또는 인가모듈을 private npm 등의 사내 모듈 시스템에 올리고, 이를 각 서비스에서 다운로드 받아 각 서비스에서 인가처리하는 방식도 많이 사용됩니다!

일반적으로는 gateway단에서 처리하는 경우가 많은 것 같네요!^^

 

마지막으로, join이 빈번하게 일어나는 서비스들은 가급적 하나로 묶는게 좋을 것 같아요!
특히, 분산트랜잭션(서로다른 서비스간의 트랜잭션)을 처리하는 부분은 난이도가 있고 까다롭기 때문에 이를 가급적 피할 수 있는 그룹으로 묶는게 좋을 것 같네요!
그럼에도 불구하고 join이 많이 들어가게 되는 부분은 조회 전용 테이블을 만들고 여기서 조회하는 방식을 사용하곤 합니다!
다만 이 때는, 데이터의 정합성에 많은 신경을 써 주셔야겠죠?!^^


결과적으로, MSA는 특히나 설계부분이 중요할 것 같습니다!^^

0

안녕하세요, 인프런 AI 인턴입니다.
돌로스원숭숭님, 마이크로서비스 아키텍처(MSA)로 나누는 것이 좋은 상황에 대해 궁금해하시는군요.

MSA로 전환하는 것이 유리한 상황은 다음과 같습니다:

  1. 서비스가 서로 다른 기술 스택을 필요로 할 때
  2. 특정 서비스의 확장성 및 독립적인 배포가 요구될 때
  3. 서비스 간의 과도한 결합으로 인해 유지보수 및 업데이트가 어려울 때
  4. 다양한 팀들이 각자의 속도로 개발해야 할 때

auth 서버와 resource 서버의 통신을 설계할 때는, 각 서비스의 역할에 따라 다릅니다. 예를 들어, auth 서버는 인증과 관련된 책임을 지고, resource 서버는 인증된 사용자에게 자원을 제공하는 역할을 할 수 있습니다. 필요할 경우에는 서버 간 통신을 최소화하면서 API Gateway 등을 통해 각 서비스 간의 통신을 관리할 수 있습니다. MSA에서는 서비스 간 통신이 느리지 않도록 설계하는 것이 중요합니다.

authService가 userService를 사용하는 경우, 사용자 정보에 대한 책임은 auth 서비스와 resource 서비스 중 어느 한쪽에 명확하게 부여하는 것이 효율적일 수 있습니다. 보안이 중요한 정보는 auth 서버에서 관리하고, 보다 일반적인 사용자 정보는 resource 서버에서 관리할 수 있습니다.

회원 테이블과 관련된 서비스의 경우, 각 서비스가 독립적으로 기능할 수 있도록 설계하는 것이 MSA에서는 중요합니다. TableJoin과 같은 작업을 해야 하는 상황에서는 데이터베이스로의 액세스나 쿼리 최적화를 통해 성능 저하를 최소화해야 합니다.

MSA가 모놀리식(monolithic) 아키텍처보다 나은 경우는 각 서비스가 충분히 독립적일 때입니다. 즉, 개별 서비스가 단독으로 그 기능을 수행하고, 서비스 간 통신은 필요한 최소한으로 제한되어야 합니다.

각 아키텍처가 갖는 장단점을 인지하고, 서비스의 규모, 팀 구조, 배포 방식 등 여러 측면을 고려해 결정하는 것이 중요합니다.

돌로스원숭숭님의 프로필 이미지
돌로스원숭숭

작성한 질문수

질문하기