처음 MSA가 대두된 이유는 Netflix에서 MSA 사용 후 대박을 냈다.
분리된 작은 서비스 :
독립적인 데이터베이스 :
느슨한 결합 :
독립적인 확장 :
배포 용이성 :
기술 다양성 :
각 프로젝트의 요구사항과 팀의 구성원, 개발/배포 프로세스에 따라서 어떤 아키텍처를 선택할지 고려해야 한다. 때로는 두가지 아키텍처를 혼합해서 사용하는 하이브리드 방식도 적용 가능하다.
도메인 주도 개발은 복잡한 소프트웨어 프로젝트에서 도메인을 중심으로 시스템을 설계하는 방법론. 이것은 비즈니스 요구사항을 잘 이해하고 이를 기반으로 소프트웨어를 개발하는데 도움이 된다.
DDD는 비즈니스 중심의 복잡한 소프트웨어 시스템을 구축할 때 매우 유용한 방법론이다.
네트워크 관점에서 클라이언트와 서버 사이에서 요청과 응답을 중계해주는 서버를 프록시 서버
라고 한다.
포워드 프록시
클라이언트 측 요청 시 요청 번호를 위장해주어 서버에서 어떤 브라우저로부터 요청이 오는지 모르도록 해주는 것을 포워드 프록시
라고 한다.
리버스 프록시(엔진엑스NginX)
서버측에서 실제 여러개의 서버가 돌아가고 있지만, 클라이언트가 이를 하나의 서버라고 인식하도록 위장해주는 것을 리버스 프록시
라고 한다.
만약, 8004 주소의 리버스 프록시(health_check, load balancing)를 거쳐서 요청이 들어가면, 백엔드 서버 여러개 중 필요한 곳에 적재 적소(부하가 적은 곳에 요청을 보내줌)에 부하를 분담하거나, 백엔드 서버가 살아있는지 확인하는 헬스 체크 용도로 사용된다.
리버스 프록시를 활용한 부하 분산은 웹 서비스나 애플리케이션의 성능을 향상시키기 위한 중요한 전략 중 하나이다. 이를 통해 서버에 들어오는 트래픽을 여러 대의 서버로 분산이 가능하다. 그러나 이러한 방식은 적용 시 아래와 같은 어려움을 직면한다.
리버스 프록시를 통한 부하 분산은 여러 대의 서버를 관리하고 구성해야 한다.
이는 초기 설정부터 각 서버의 상태를 모니터링하고 유지보수하는 등 관리 복잡성이 증가하게 된다.
리버스 프록시는 서버에 들어오는 요청을 분배하는 역할을 한다.
올바른 프록시 설정을 구성하지 않으면 성능 저하나 불안정성이 발생할 수 있다.
이를 최적화 하려면 서버 및 네트워크 아키텍처에 대한 깊은 이해가 필요하다
여러 대의 서버가 사용될 경우, 각 서버의 상태를 모니터링하고 관리해야 한다.
만약 하나 이상의 서버가 다운되면 프록시는 트래픽을 분배하지 못하게 될 수 있다.
부하 분산을 적용하면 클라이언트의 요청이 다양한 서버로 전달될 수 있다.
이로 인해 하나의 서버 안에서만 유지되는 세션은 상태를 유지하는 것이 어렵다.
또한, 데이터베이스와 같은 공유 리소스의 일관성을 보장하는 것도 복잡해질 수 있다.(lock)
프록시를 통해 들어오는 요청을 신뢰할 수 있는지 확인해야 한다. 또한, SSL/TSL 암호화와 같은 보안 기능을 올바르게 구성해야 한다.
여러 서버에서 작동하는 경우, 로깅과 모니터링 시스템을 통해 전체 시스템의 상태를 추적하고 문제를 식별하는 것이 중요하다.
프록시를 통한 부하 분산은 네트워크를 통해 데이터를 전송하므로 지연 및 대역폭 문제가 발생할 수 있습니다.
이러한 어려움들을 극복하기 위해서는 잘 설계된 리버스 프록시 아키텍처와 각종 모니터링, 로깅, 백업 및 복구 등의 보완적인 시스템이 필요합니다. 또한, 클라우드 기술을 활용하여 자동 확장과 관리를 수행하는 것이 효과적일 수 있습니다.
참고
MSA에서 인증,인가 목적으로 세션 사용이 어려운 이유는 수평 스케일링이 어렵기 때문이다.
수평 스케일링은 해당 서버에 부하가 높아질 경우 동일한 서비스의 VM 인스턴스를 하나 더 추가하는 스케일 업 방식이다. 하지만, 세션은 해당 서버 내에서만 사용이 가능하기 때문에 다른 VM 서버에서 사용할 수 없어, 별도의 비용이 추가된다.
반면에 JWT 사용 시, 세션 사용으로 인한 수평 스켈링의 한계를 보완해준다.
스티키 세션 : 회원이 로그인한 서버에서만 요청을 받도록 해주는 상태. 이렇게 하면, 수평 스켈링의 한계를 보완해주고, 각 서버마다 부하가 낮은곳으로 붙혀주면 되기 때문에 부하 밸런싱도 가능함.
비동기적으로 실행 시, 공용 데이터를 사용하는 경우 해당 데이터가 의도치 않은 결과가 도출될 수 있다.
레이스 컨디션이 많아지면, 비관적 락(요청 시마다 lock을 걸어줌)을 걸어주고, 크게 충돌이 많이 안일어나면 낙관적 락(version 값을 만들어 version 일치 여부 확인 후 요청을 반영하며, 해당 요청 실패시마다 재요청을 수행)을 걸어준다.