카샤의 만개시기

마이크로서비스 시작하기 (7편) - 라우팅 본문

Java/MSA

마이크로서비스 시작하기 (7편) - 라우팅

SKaSha 2019. 6. 25. 15:07

MSA를 포함하는 분산 환경에서의 서비스 호출은 IP주소와 포트를 이용하여 이루어지는데, 클라우드 환경이 되면서 오토 스케일링을 통해 동적으로 서비스가 돌아가면서 IP나 포트 역시 동적으로 변경되는 일이 흔하게 되었습니다.
그래서 서비스 클라이언트는 서비스를 호출할때 서비스의 위치(IP, Port)를 조회 할 필요성을 느끼게 되었는데 이를 서비스 디스커버리(Service Discovery)라고 합니다.
서비스 디스커버리는 기본적으로 서비스를 등록하고 등록된 서비스의 목록을 리턴하는 기능이지만 서비스의 Health check를 통하여 어떤 서비스 인스턴스가 살아있는지, 서비스간의 로드밸런스, 서버 목록에서의 Master/Slave 정보 리턴, 서버에 접속하기 위한 인증키 정보 리턴, 보안과 암호화와 같은 다양한 기능으로 확장이 가능합니다.

서비스 레지스트리는 모두 동등하게 생성되는 것이 아니며 물리적인 제약과 CAP 이론에도 제약을 받습니다. CAP theorem이란 분산 스토리지(서비스)는 일관성(Consistency), 가용성(Availability), 분할 허용성(Partition tolerance)에서 두가지만 함께 제공 받을 수 있다는 것을 말합니다.

CAP theorem

일관성은 read operation이 최신 데이터를 받는 것을 보장하는 것이며 만약 이를 보장하기 어렵다면 에러를 돌려줘야 합니다. 일반적으로 분산 스토리지를 구현할 때 위 특징 중 일관성이 가장 구현하기 어려운 특성입니다.
가용성은 모든 operation이 에러가 아닌 데이터를 돌려주는 것이며 이때 돌려주는 값은 최신 값이 아니어도 상관없습니다. 심지어 Eventual consistency와 가용성을 보장하는 시스템에서는 실제로 존재할 수 없는 데이터 조합이 생길 수도 있습니다.
분할 허용성은 분산 혹은 파티션 상황에서도 시스템이 정상 작동해야 한다는 것이며 시스템이 정상 동작한다는 것이 언제나 최신 데이터를 보장하거나 에러가 아닌 값을 준다는 것이 아닙니다.

클라우드에서는 AP(가용성, 분할 허용성)이 필수가 되기 때문에 일관성에 대한 대비책을 보완해야 합니다. Consistency 관점에서 클라우드 시스템은 기본적으로 Availability를 지원하는 복제 노드들에 동일한 데이터를 보내려고 할 때 특정 노드들은 쓰기에 성공해도 다른 몇 노드들이 어떤 사정으로 쓰기에 실패한 경우 시스템에서는 서로 다른 데이터 상태가 공존하게 되어 일관성 있지 않은 상태가 됩니다. 이를 위해서는 무거운 Consistency 정책 대신 Eventually Consistency를 이용하여 일관성을 해결하게 됩니다.
Eventually Consistency는 모든 요청에 대해 모든 서버가 완벽히 같은 순간에 같은 값을 갖지는 않지만 결국에는 같은 값을 가질 것을 보장하는 것입니다.

Service Discovery

서비스 디스커버리는 Client Side Discovery 방식과 Server Side Discovery 방식으로 나뉩니다.

Client Side Discovery

Service A의 인스턴스들이 생성이 될때 서비스의 주소와 포트 정보를 Service Registry에 등록합니다.
Service A를 호출하고자 하는 클라이언트는 Service registry에 Service A의 주소를 물어보고 등록된 주소를 받아서 그 주소로 서비스를 호출하게 됩니다.
Client Side Discovery

Server Side Discovery

호출이 되는 서비스 앞에 일종의 proxy 서버 (로드밸런서)를 넣는 방식인데 서비스 클라이언트는 이 로드밸런서를 호출하면 로드밸런서가 Service registry로 부터 등록된 서비스의 위치를 리턴하고 이를 기반으로 라우팅을 하는 방식입니다.
일반적으로 클라우드의 로드밸런서가 이 방식에 해당됩니다.
Server Side Discovery

DiscoveryClient

스프링 클라우드는 DiscoveryClient 추상화를 통해 클라이언트가 다양한 유형의 서비스 레지스트리를 쉽게 이용할 수 있고 다양한 구현체를 쉽게 플러그인해서 사용할 수 있게 해줍니다. 전문화된 Service Discovery로는 클라우드 파운드리,아파치 ZooKeeper, Hashcorp의 Consul, Netflix Eureka 등이 있습니다.

참고

CAP theorem
클라우드 환경에서 새로운 ACID, BASE 그리고 CAP
MSA에서 Service discovery 패턴

NEXT

Comments