[MSA] - 3. 필요한 서비스를 찾아주는 Service Discovery

안녕하세요. 다들 구정 연휴 잘 보내고 계신가요? 구정 언휴긴 하지만, 저에게는 길게 느껴지는 연휴인지라, 오늘도 이렇게 끄적여 봅니다.

오늘은 Service Discovery에 대한 이야기를 다뤄보도록 할게요. 서비스 디스커버리는 지난 API Gateway에서도 잠시 다뤘던 내용이지만 서비스가 분리되어 있는 MSA에서 각 서비스가 다음에 불러야할 서비스가 어디에 있는지를 찾아주는 검색 기능입니다.

 

 

What is Service Discovery ?

쉬운 설명을 위해 Wi-Fi를 예로 들어보겠습니다. 우리는 스마트폰이나 태블릿 PC, 노트북에서 인터넷을 사용하기 위해 Wi-Fi에 연결해야 합니다. 원래라면, 직접 SSID를 입력해야만 하죠.

하지만 AP 검색 기능을 제공하기 때문에 우리는 이렇게 디바이스에서 보여주는 AP에 접속하여 내가 구축한 AP 혹은 다른 카페나 편의점 등에 있는 AP를 사용할 수 있습니다.

그런데, MSA를 구성하다보면 위와 같은 상황이 발생합니다. 각 서비스별로 서버를 별도로 구성했지만 대용량 트래픽을 처리하게 되면 위와 같이 로드 밸런싱을 하게 될 것입니다.

로드 밸런싱을 하게 되면, 서버가 늘어나는 것이 문제가 아닌 해당 주소가 무작위로 생성된다는 것에 있습니다. 물론 그룹을 묶어서 범위를 정할 수도 있겠지만, 이를 동적으로 관리하는 것이 과제일 것입니다.

서비스 디스커버리를 사용하게 되면, 게이트웨이에서 원하는 서비스를 찾을 수 있고, 해당 서비스에 맞춰 보내주기 때문에 이러한 문제점을 덜 수 있습니다.

 

 

Service Discovery 구성

서비스 디스커버리는 각 서비스 인스턴스의 주소를 가지고 있는 서버와 그를 받는 클라이언트 방식으로 이루어진 Client-Server 아키텍처를 가지고 있습니다. 

우리는 그 서버를 Service Registry라고 하고, 그 클라이언트를 Registry Client라고 이야기 해봅시다.

각 서비스 인스턴스에 Registry Client를 붙여주고, 해당 클라이언트들이 자신들의 주소를 서버에 접속하여 공유할 수 있도록 합니다. 그리고 서비스 디스커버리는 이들 서비스를 찾아주는 역할을 하게 되는 것입니다.

이러한 서비스를 제공하는 대표적인 서비스 레지스트리는 다음과 같습니다.

  • Netflix Eureka
  • Apache ZooKeeper
  • etcd
  • consul

 

 

Register Pattern

Service Registry는 위 구조와 같이 Registry Client가 직접 Service Registry에 등록하여 차후에 게이트웨이나 다른 인스턴스가 빠르게 찾을 수 있도록 해주는 등록 해주는 패턴이 있는데, 이를 우리는 Self-Registration Pattern이라 합니다.

  • 셀프 등록 패턴 (Self-Registration Pattern)
  • 써드 파티 등록 패턴 (3rd-Party Registration Pattern)

Service Discovery에 사용되는 서비스 등록 패턴은 위 2가지가 제공되며 셀프 등록 패턴은 등록과 관리를 하는 주체가 서비스 인스턴스 자신입니다. 따라서 Service Registry에 자신의 정보를 등록하고, 주기적으로 자신이 살아 있다는 신호를 계속 전송하게 되는데, 만약 이 신호가 끊길 경우, Registry에서 이 정보는 사라지게 됩니다. 주로 Eureka에서 사용하는 방식입니다.

반대로 3rd 파티 등록 패턴은 외부에서 서비스를 등록하여 관리하는 방법으로 Service Registry가 각 서비스 인스턴스의 변화를 Polling 하거나, Pub/Sub를 수햄함으로써 계속 업데이트를 하게 됩니다.

하지만 이 방법의 단점은 Service Registry가 죽어버리면, 그 기능 자체를 손실해버리기 때문에 Risk가 굉장히 크다는 것입니다. Broker 패턴의 단점을 그대로 빼닮은 것이죠. 이러한 방식은 NetflixOSS Prana에서 사용하는 방식입니다. 특히 Prana는 non-JVM 언어로 작성된 서비스 인스턴스들을 위해 만들어진 애플리케이션으로 애플리케이션과 같이 실행되죠.

 

 

마치며...

연휴이기 때문에 오늘은 귀경길에 잠시 쉬어가는 시간 동안 보실 수 있도록 짧게 작성해봤습니다. 물론 주제 자체도 그렇게 어려운 주제도 아니기 때문에 가벼운 마음으로 보실 수 있을 것이라 생각합니다.

하지만 서비스 디스커버리는 MSA에 있어, 없어서는 안될 존재입니다. 서비스 인스턴스가 무수히 많아지고, 이들이 흩어지는 형태이기 때문에 우리가 원하는 서비스를 클라이언트에게 빠르게 제공하기 위해서는 이는 반드시 도입해야 할 것입니다.

다음 포스트에서는 Spring Cloud를 이용해 이를 직접 구현해보는 시간을 가져보도록 하겠습니다.

 

Ref: 마이크로서비스(4) 서비스 디스커버리 - (https://futurecreator.github.io/2018/10/18/service-discovery-in-microservices/)

comments powered by Disqus

Tistory Comments 0