마이크로서비스에서 서비스 디스커버리 패턴의 필요성과 해결 방법
이 강의에서는 전통적인 로드 밸런서를 사용하는 것이 마이크로서비스와 클라우드 네이티브 애플리케이션에서 왜 한계가 있는지 설명한 후, 그 대안으로서 서비스 디스커버리 패턴(Service Discovery Pattern)이 어떻게 문제를 해결하는지를 다룹니다. 이 패턴은 마이크로서비스가 서로를 찾고 통신하는 데 필요한 메커니즘을 제공합니다.
1. 서비스 디스커버리 패턴이란 무엇인가?
- 정의: 서비스 디스커버리 패턴은 실행 중인 서비스 인스턴스에 대한 모든 정보를 추적하고 저장하는 서비스 레지스트리(Service Registry)를 사용하는 패턴입니다.
- 역할: 새 인스턴스가 생성될 때마다 해당 인스턴스는 서비스 레지스트리에 등록되고, 인스턴스가 종료되거나 삭제될 때 자동으로 레지스트리에서 제거됩니다.
- 예시: 예를 들어,
loans
마이크로서비스의 5개의 인스턴스가 생성되면, 이들은 모두 서비스 레지스트리에 자신을 등록하고, accounts
마이크로서비스는 이 레지스트리를 통해 loans
서비스의 관련 정보를 발견(discover)할 수 있습니다.
2. 서비스 레지스트리와 서비스 디스커버리의 동작 원리
- 서비스 레지스트리: 서비스 레지스트리는 현재 실행 중인 서비스 인스턴스의 정보를 유지합니다. 각 서비스 인스턴스가 시작될 때, 자신의 IP 주소와 포트 번호를 레지스트리에 등록해야 합니다.
- 주기적 하트비트: 서비스 인스턴스는 주기적으로 자신의 상태를 알리기 위해 레지스트리에 하트비트를 보내야 합니다. 만약 레지스트리가 특정 인스턴스로부터 하트비트를 받지 못하면, 해당 인스턴스의 상태가 좋지 않다고 판단하고, 그 정보를 레지스트리에서 삭제합니다.
- 서비스 종료: 서비스 인스턴스가 종료되거나 제거될 때도 레지스트리에서 자신의 정보를 제거해야 합니다.
- 서비스 검색: 다른 마이크로서비스가 특정 서비스와 통신하려 할 때, 그 서비스의 IP 주소와 포트 정보를 서비스 레지스트리에서 검색하여 통신을 시도합니다.
3. 로드 밸런싱 문제의 해결
- 다중 인스턴스 관리: 서비스 레지스트리는 동일한 애플리케이션의 여러 인스턴스가 동시에 활성화될 수 있음을 인식하고, 이 정보를 바탕으로 로드 밸런싱 전략을 실행합니다.
- 로드 밸런싱: 특정 마이크로서비스가 다수의 인스턴스와 통신할 때, 레지스트리는 로드 밸런싱 전략에 따라 트래픽을 균등하게 분배합니다.
4. 클라이언트 측 서비스 디스커버리와 서버 측 서비스 디스커버리
- 클라이언트 측 서비스 디스커버리: 클라이언트가 직접 서비스 레지스트리와 통신하여 다른 서비스의 위치를 검색한 다음, 해당 서비스와 통신합니다. 이 과정에서 클라이언트는 로드 밸런싱을 직접 처리할 수 있습니다.
- 서버 측 서비스 디스커버리: 서버 측에서 모든 디스커버리와 로드 밸런싱을 관리합니다. 클라이언트는 서버에 요청을 보내고, 서버가 적절한 서비스 인스턴스로 요청을 전달합니다.
5. 서비스 디스커버리 패턴의 구성 요소
- 중앙 서버: 모든 서비스 인스턴스의 주소 정보를 유지하고 관리하는 중앙 서버가 필요합니다. 이는 일종의 글로벌 주소 뷰를 유지하는 역할을 합니다.
- 자기 등록(Self-Registration): 서비스 인스턴스가 시작될 때 중앙 서버에 자신의 IP 주소와 포트를 등록합니다.
- 하트비트(Heartbeat): 서비스 인스턴스는 주기적으로 중앙 서버에 자신이 여전히 활성 상태임을 알리는 하트비트를 보냅니다.
- 등록 해제(Deregistration): 서비스 인스턴스가 종료되거나 제거될 때 중앙 서버에서 해당 정보가 제거됩니다.
- 주소 조회: 다른 마이크로서비스가 특정 서비스와 통신하려 할 때, 중앙 서버에 문의하여 해당 서비스의 위치 정보를 조회합니다.
요약
서비스 디스커버리 패턴은 마이크로서비스가 동적으로 생성되고 소멸되는 환경에서 서비스 간의 통신을 가능하게 하고, 로드 밸런싱 문제를 해결하는 데 중요한 역할을 합니다. 이를 위해 서비스 레지스트리를 활용하며, 이는 중앙 서버 역할을 하여 모든 서비스의 위치 정보를 관리합니다. 이 패턴은 클라우드 네이티브 애플리케이션의 핵심적인 부분으로, 전통적인 방법의 한계를 극복하는 데 필수적입니다.