개발 유연성의 한계 극복
기존 모놀리틱 방식은 모든 구성요소가 하나의 애플리케이션으로 구성되어 있어 변화에 대한 대응이 어렵습니다. 새로운 기능 추가를 위해 전체를 빌드/배포해야 하는 문제가 있었죠. MSA는 독립적 서비스 단위 구성으로 수정 및 빌드/배포가 신속히 가능합니다.
요구사항 처리 시 모놀리틱 시스템 대비 빠른 대처 가능
배포/롤백 리스크의 획기적 감소
MSA는 여러 개의 서비스로 구성되어 있습니다. 이 중 수정이 필요한 부분만 빠르게 찾아 정확한 대응이 가능합니다.
또한 쿠버네티스 기능을 사용하여 서비스 무중단 배포를 할 수 있습니다.
장애 격리의 신뢰성
모놀리틱은 단일 애플리케이션으로 이뤄져있어 특정 부분에 문제가 발생하면 전체 시스템 장애로 이어지게 됩니다. MSA는 각각의 서비스가 약한 결합도를 가지고 있기 때문에, 특정 서비스 장애가 타 서비스에 영향을 최소로 주거나 아예 주지 않도록 구성이 가능합니다. 이를 통해 장애 서비스만 빠르게 복구할 수 있습니다.
리소스의 효율적 사용
모놀리틱은 단일 구조로 되어 있기에, 통으로 확장이 필요해 리소스의 낭비가 발생하게 됩니다. 이에 비해 MSA 시스템은 사용자 부하 발생시 부하 발생 서비스만 스케일 아웃 기능을 통한 확장이 가능하여 리소스를 효율적으로 사용할 수 있습니다.
장애 감지 및 격리
만약 장애가 발생한 서비스를 호출한다면 요청이 타임아웃만큼 대기하게 되고, 쓰레드와 메모리 및 CPU 등의 자원을 점유하게 된다. 이것은 결국 시스템 리소스를 부족하게 만들어 장애를 유발할 수 있다. 장애가 발생한 것은 다른 서비스인데, 장애가 전파되는 것이다. 서킷 브레이커 패턴은 장애가 발생한 서비스를 감지하고, 더 이상 요청을 보내지 않도록 차단함으로써 장애를 격리시켜 준다. 그래서 장애가 발생한 기능 외의 다른 기능들은 동작하게 하여 시스템의 안정성을 높일 수 있다.
자동 시스템 복구
서킷 브레이커는 요청이 차단되면 해당 서비스가 정상인지 주기적으로 검사한다. 그리고 해당 서비스가 복구되었다면 차단이 해제되고, 정상적으로 요청을 보내게 된다. 이러한 부분들은 시스템이 자동으로 해주므로 개발자들이 신경쓰지 않아도 된다. 대부분 타임아웃 등을 위한 모니터링 기능까지 제공하며, 서킷 브레이커가 모든 연동에 적용되면 대시보드를 통해 전체 시스템들의 연동 현황까지 모니터링 가능하다.
빠른 실패 및 고객 응답
만약 다른 서비스가 문제있음을 알 수 있다면, 타임아웃 동안 기다리며 자원을 낭비할 필요가 없다. 그래서 빠르게 장애를 탐지하는 것이 중요한데, 서킷브레이커 패턴을 적용하면 가능한 빠르게 실패를 반환하고, 고객에게 응답을 전달할 수 있다.
장애 서비스로의 부하 감소
외부 서비스가 완전히 죽지는 않았는데, slow query 등의 이유로 사용 가능한 쓰레드가 더 남아있지 않을 수도 있다. 이때 계속 요청을 보내는 것은 외부 서비스의 상황을 악화시켜 장애를 유발시킬 수 있다. 그러므로 해당 서비스가 안정을 찾도록 요청을 멈추는 것이 좋은데, 서킷 브레이커를 사용하면 해당 서비스는 더 이상의 요청이 유입되지 않아 장애를 복구할 수 있는 기회를 얻을 수 있다.
장애 대안 커스터마이징
외부 서비스에서 장애가 발생했다면 원하는 데이터를 얻지 못할 수 있다. 이때 아무런 대응책이 없다면 해당 서비스 역시 장애가 발생하게 된다. 서킷 브레이커를 적용하면, 장애 대안을 커스터마이징 할 수 있는데, 예를 들어 다른 소스로부터 값을 얻어오거나, 서킷 브레이커가 자체적으로 캐싱해 둔 값으로 응답하는 등 다양한 방법을 적용할 수 있다. 그러면 외부에 장애가 발생해도 문제없이 서비스를 운영할 수도 있다.
데이터 손실 방지
외부 API 또는 시스템 간 데이터 전달에서 네트워크 장애나 시스템 오류로 인해 데이터가 손실될 수 있습니다. Kafka는 데이터가 손실되지 않도록 메시지를 로그에 지속적으로 기록하고, 소비자(consumer)가 데이터를 안전하게 가져갈 때까지 메시지를 유지합니다. 이를 통해 데이터 손실 위험을 최소화할 수 있습니다.
비동기 처리 및 시스템 간 느슨한 결합
외부 API 또는 서비스가 응답 속도가 느리거나 일시적으로 다운되더라도, Kafka를 사용하면 메시지를 큐에 넣어 비동기적으로 처리할 수 있습니다. 이를 통해 호출하는 시스템이 외부 API의 응답을 기다리지 않고 계속해서 작업을 진행할 수 있어 시스템 전체의 성능과 안정성이 높아집니다.