Stomp는 Simple Text Oriented Messaging Protocol의 약자로,
Websocket 위에서 동작하는 텍스트 기반 메세징 프로토콜입니다.
Stomp는 Publish-Subscribe 매커니즘을 제공합니다.
Broker를 통해 다른 사용자들에게 메시지를 보내거나 서버가 특정 작업을 수행하도록 메세지를 보낼 수 있습니다.
2. WebSocket 대신 Stomp를 사용하는 이유가 뭔가요?
각 커넥션마다 WebSocketHandler를 구현하는 것보다 Controller Annotation이 적용된 객체를 이용해 조직적으로 관리를 할 수 있습니다. ( 메세지를 Controller 객체의 MessageMapping Annotation으로 라우팅시킬 수 있습니다. )
Stomp의 Destination(URI 경로)를 기반으로 Spring Security를 적용해 메세지를 보호할 수 있습니다.
정리
Stomp는 Websocket 위에서 동작하는 텍스트 기반의 메세지 전송 프로토콜입니다.
메세지를 Controller 어노테이션이 적용된 객체를 이용해 조직적으로 관리할 수 있으며 Spring Security를 적용해 메세지를 보호할 수 있습니다.
간단하게만 정리해보았는데 좀 더 자세하게 알아야 할 것 같습니다 ㅠ 추후에 정리 한번 다시 하겠습니다
MicroService가 발생하게 된 배경은 보통의 프로젝트 형태인 Monolithic Architecture는 프로젝트 규모가 커질수록, 빌드 시간이 길어지고 유지보수가 힘들다는 특징이 있습니다. 이를 보완하기 위해서 MicroService의 형태가 발생하게 되었습니다.
MicroService란,
어플리케이션을 이루는 서비스들을 기능 단위로 쪼개서 구축하는 것을 말하며 각 서비스들은 REST API를 통해 통신합니다.
장점
1. 수정 사항 및 추가사항이 있는 서비스만 빌드, 배포가 가능합니다.
2. 해당 서비스에 더 적절한 서로 다른 언어나 기술을 사용할 수 있습니다.
단점
1. 모니터링이 힘들고, 개발 및 테스트가 까다롭습니다.
2. 모놀로식에 비해 구축 난이도가 어렵습니다.
보통의 프로젝트 형태인 Monolithic Architeture의 형태는 다음과 같습니다.
MicroService와 반대되는 개념으로, 하나의 서버에서 모든 서비스가 동작하는 것을 말합니다.
장점
1. 아키텍처가 단순하고 모든 서비스의 개발환경이 같아 개발이 용이합니다.
2. End-to-End Test(사용자 입장에서의 테스트)가 용이합니다.
단점
1. 조금만 수정해도 전체를 다시 빌드하고 재배포해야 합니다.
2. 프로젝트 규모가 커짐에 따라 빌드 시간이 증가하고 유지보수가 힘듭니다.
3. 일부 서비스의 오류가 전체 서비스에 영향을 줍니다.
MicroService에 장점만 있는건 아니기 때문에, 상황에 따라 적절하게 서비스를 구축해야합니다.
MSA를 사용하는 대표적인 기업으로는 아마존과 Netflix가 있습니다.
넷플릭스는 2007년 데이터 베이스 손상으로 인해 3일간 서비스 장애를 겪고 나서 고가용성, 유연한 확장성, 빠르고 쉬운 배포 의 장점을 가진 MSA 구조를 채택했습니다. 이 과정에서 경험한 노하우 및 문제 해결 방법을 오픈소스로 공개했습니다.
# Spring Cloud
Spirng Cloud는 Springboot를 기반으로 MSA 구축에 특화된 라이브러리들의 집합입니다. Spring Cloud에는 Eureka, Zuul(springboot 2.4? 2.5 부터 지원안함> Spring Cloud Gateway로 대체) , Histrix, Ribbon 등 많은 넷플릭스 OSS(Open Source Software) 가 통합되어 있습니다.
# Eureka - Service Discovery Server
MSA를 이루는 서비스들은 동적으로 확장 및 축소되는데, 이 인스턴스의 상태를 동적으로 관리하는 서버를 말합니다.
새로운 서비스 인스턴스는 시작될 때 IP, 포트번호 등을 스스로 전송합니다. 이로 인해 운영자들은 서비스를 수평 확장할 때 IP를 신경쓸 필요가 없게됩니다.
# Zuul - API GateWay
API 게이트웨이는 사용자의 Request에 맞는 서비스로 라우팅시켜주는 역할을 합니다. Client 와 Server의 중간다리역할을 한다고 생각하면 됩니다. 사용자에게는 API GateWay만 노출되게 됩니다.
이유로는 적절한 사용자의 요청인지 확인하는 인증, 각 서비스에 대한 요청을 로그로 기록하는 로깅, 요청사항을 구분하는 필터 등을 통해 모든 요청에 대한 관리를 수월하게 하기 위해 필요합니다.
# Ribbon - Client Side Load Balancer
Ribbon은 Cilent에 탑재하는 소프트웨어 로드밸런서입니다.
# Hystrix - Circuit Breaker
특정 서비스에 과부화가 걸려 장애가 발생하면, 전체 서비스에 장애를 전파하는 경우가 있습니다. 이와 같은 현상을 막아주는 역할을 하는 것이 서킷 브레이커입니다. Hystrix는 각 서비스의 오류 상태 및 복구 상태, 오류 내용을 파악하며 장애가 발생하면 통신을 즉시 중단시키고 문제가 발생한 서비스를 격리시킵니다. 문제가 해결될 때 까지 호출을 제한합니다.
또한 정해진 시간내에 호출이 실패하면 대신 동작하는 예외 처리인 Fallback을 지원해 시스템 장애로부터 유연하게 대처할 수 있습니다.