MSA 주요 패턴: 서비스 디스커버리(Service Discovery) 패턴

2024. 11. 20. 20:45·기초 지식/MSA

1. 서비스 디스커버리 패턴

MSA 에서는 언제든 새로운 원격 서버 인스턴스(pod) 가 추가되거나 제거될 수 있으므로 그 개수와 물리적 주소가 고정되어 있지 않기 때문에 클라이언트가 물리적인 위치를 몰라도 서비스를 호출할 수 있도록 하는 것이 중요하다.
즉 “물리적인 주소”가 아니라 “논리적인 주소” 로 서버 인스턴스를 찾을수 있어야 한다.

1.1 클라이언트 사이드 서비스 디스커버리

클라이언트 사이드 서비스 디스커버리의 구성은 아래와 같다.

 

 

마이크로 서비스의 인스턴스들(pod)의 물리적인 주소를 Service Registry 라는 곳에 저장한다. 이때 인스턴들은 주기적으로 Hearthbeat 를 Service Registry 로 전송하여 Service Registry가 인스턴스 상태를 체크할 수 있도록 한다.

클라이언트는 직접 Service Registry 에 접근하여 주소 목록을 조회하고, 그 주소중 한 곳으로 요청을 전송한다. 이때 클라이언트에서 직접 로드밸런서를 구현하여 적절히 트래픽이 분산될 수 있도록 한다.

클라이언트 사이드 서비스 디스커버리의 장애 대응

[Service Registry 장애 대응]

어떠한 이유에서 Service Registry 가 다운된 상황에서 클라이언트가 주소를 요청하는 경우에 문제가 발생할 수 있다. 이러한 이유로 클라이언트는 Service Registry 가 반환한 주소 목록을 일정 기간동안 캐시를 해두는 전략을 사용하여 장애 대응 시간을 벌 수 있다.

 

[Instance 장애 대응]

Service Registry 가 반환한 주소 목록을 캐싱해뒀을 때 Service Registry 에서는 장애가 있는 Instance 라고 판단하여 주소 목록에서 제외했으나 클라이언트가 계속 요청을 보내는 경우가 있을 수 있다. 이런 경우에 기존 캐시에서 해당 Instance 주소를 삭제하고 다른 주소에 요청을 보내는 등의 로직이 클라이언트에서 적절히 구현되어야 한다.


1.2 서버 사이드 서비스 디스커버리

클라이언트 사이드 서비스 디스커버리의 구성은 아래와 같다.

 

 

마이크로 서비스의 인스턴스들(pod)의 물리적인 주소를 Service Registry 라는 곳에 저장한다. 이때 인스턴들은 주기적으로 Hearthbeat 를 Service Registry 로 전송하여 Service Registry가 인스턴스 상태를 체크할 수 있도록 한다.

클라이언트는 서버에서 구현된 로드밸랜서 주소로 요청을 보내고, 로드밸런서는 클라이언트 요청에 적절한 인스턴스 주소를 찾아서 요청을 처리한다.

서버 사이드 서비스 디스커버리 장애 대응

[Service Registry 장애 대응]

어떠한 이유에서 Service Registry 가 다운된 상황에서 LB가 주소를 요청하는 경우에 문제가 발생할 수 있다. 이러한 이유로 LB는 Service Registry 가 반환한 주소 목록을 일정 기간동안 캐시를 해두는 전략을 사용하여 장애 대응 시간을 벌 수 있다.

 

[Instance 장애 대응]

Service Registry 가 반환한 주소 목록을 캐싱해뒀을 때 Service Registry 에서는 장애가 있는 Instance 라고 판단하여 주소 목록에서 제외했으나 LB가 계속 요청을 보내는 경우가 있을 수 있다. 이런 경우에 기존 캐시에서 해당 Instance 주소를 삭제하고 다른 주소에 요청을 보내는 등의 로직이 LB에 적절히 구현되어야 한다.

1.3 K8s 에서 Service Discovery

K8s 에서 Service 란 Service Object 를 말하는 개념이다. K8s 네트워크 Object 에서 언급한것과 같이 Service Object는 클러스터에서 실행중인 pod 에 접근할 수 있는 방법을 정의한 것이다. 따라서 클라이언트 코드는 가변적인 pod 의 물리 주소 대신 Service Object 를 통해 더 안정적인 네트워크 엔드포인트를 제공 받는다.

 

이러한 사실에 기반하여 K8s 의 Service Object 자체가 서비스 디스커버리 패턴을 구현한 구현체라고 생각할 수 있겠다. 이때 Service Discovery 의 역할은 K8s 마스터를 구성하는 요소 중 etcd 와 Controller Manager 와 API Server 를 통해 구현되었다.

'기초 지식 > MSA' 카테고리의 다른 글

MSA 주요 패턴: 중앙화된 로그 집계 패턴  (0) 2024.11.27
MSA 전환을 위한 서비스 분리 전략  (1) 2024.11.26
MSA 주요 패턴: 사가(Saga) 패턴  (1) 2024.11.20
MSA 개념  (2) 2024.11.20
'기초 지식/MSA' 카테고리의 다른 글
  • MSA 주요 패턴: 중앙화된 로그 집계 패턴
  • MSA 전환을 위한 서비스 분리 전략
  • MSA 주요 패턴: 사가(Saga) 패턴
  • MSA 개념
개발프로브
개발프로브
가볍게, 오랫동안 기록하고 싶은 블로그입니다.
  • 개발프로브
    ProbeHub
    개발프로브
  • 전체
    오늘
    어제
    • 분류 전체보기 (56)
      • 탐구 생활 (47)
        • 개발 탐구 (8)
        • FastAPI CORS (3)
        • FastAPI Log (4)
        • gRPC&Python (4)
        • SpringBoot 파헤치기 (2)
        • Python Monorepo (3)
        • Python 과 zstd (2)
        • Python (4)
        • FastAPI (4)
        • Terraform (8)
        • MSA (0)
        • GraphQL (2)
        • 데이터베이스 (2)
        • 네트워크 (0)
      • 기초 지식 (9)
        • Terraform (2)
        • MSA (5)
        • K8s (2)
  • 블로그 메뉴

    • 링크

      • github
      • stackoverflow
    • 공지사항

    • 인기 글

    • 태그

      brotli
      zstd
      PostgreSQL
      FastAPI
      python arn64
      python 성능 개선
      Terraform
      springboot
      rest vs grpc
      fastapi logging
      python amd64
      sqlalchemy
      티스토리챌린지
      fastapi cors
      django 성능 개선
      java
      python 불변 객체
      ORM 문제
      gzip
      ORM 성능 최적화
      백엔드 성능
      spring 트랜잭션
      ORM 성능
      RDBMS 성능 최적화
      grpc
      MSA
      Python
      오블완
      granian
      python graviton
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.0
    개발프로브
    MSA 주요 패턴: 서비스 디스커버리(Service Discovery) 패턴
    상단으로

    티스토리툴바