본문 바로가기
기타

[MSA] 마이크로서비스 통신 방식

by Nhahan 2025. 4. 22.

성능

프로세스 내 호출의 성능은 프로세스 간 호출의 성능과 기본적으로 차이가 있다. 프로세스 내 호출을 할 때, 기본 컴파일러와 런타임은 호출의 영향을 줄이려고 마치 처음에 호출이 없었던 것처럼 전체 호스트 최적화를 수행할 수 있다. 하지만 프로세스 간 호출에서는 이러한 최적화가 불가능하며, 패킷을 전송해야한다.

 

메서드에 매개변수를 전달할 때 보통 전달할 데이터 구조체는 이동되지 않는다. 대신 메모리 위치에 대한 포인터를 전달할 가능성이 높다. 객체나 데이터 구조를 다른 메서드에 전달할 때 데이터를 복사하려고 더 많은 메모리를 할당할 필요는 없다.

 

반면에 네트워크를 통해 마이크로서비스 간 호출을 할 때 데이터는 실제로 네트워크를 통해 전솔될 수 있는 특정 형태로 직렬화돼야 한다. 그런 다음에 데이터는 전송되고 다른 쪽 끝에서 역직렬화돼야 한다. 따라서 프로세스 간에 전송되는 페이로드의 크기에 대해 더 주의를 기울여야한다. 송수신 데이터양을 줄이거나(정보 은닉을 생각하면 오히려 좋음), 더 효율적인 직렬화 메커니즘을 선택하거나 데이터를 파일 시스템으로 내려 해당 파일 위치에 대한 참조 정보를 대신 전달할 수 있기 때문이다.

 

인터페이스 변경

마이크로서비스 간의 통신에서 인터페이스를 노출하는 마이크로서비스와 해당 인터페이스를 사용하는 소비자 마이크로서비스는 개별적으로 배포 가능한 마이크로서비스다. 마이크로서비스 인터페이스에 하위 호환성을 깨뜨리는 변경을 할 때는 둘 다 새 인터페이스를 사용하도록 업데이트하기 위해 소비자와 함께 락스텝 배포(복수 개의 서비스를 동일한 CI/CD로 동시에 배포)를 하거나 새로운 마이크로서비스 계약의 출시를 단계적으로 수행할 방법을 찾아야한다.

 

에러 처리

분산 시스템에서 에러의 특성은 다양하다.

  • 충돌 실패: 서버가 중단될 때까지 모든 것은 정상이다. 재부팅한다.
  • 누락 실패: 전송 후 응답을 받지 못했다. 또는 다운스트림 마이크로서비스가 메시지를 발행할 것으로 예상했으나 그냥 중지한 상황도 포함한다.
  • 타이밍 실패: 어떤 일이 너무 늦게 발생했거나 너무 일찍 발생했다.
  • 응답 실패: 응답은 받았지만 잘못된 응답으로 보인다. 예를 들어 주문 요약을 요청했지만 필요한 정보가 응답에 누락됐다.
  • 임의 실패: 비잔티움 실패(시스템에 발생할 수 있는 임의의 실패를 견디는 시스템)라고도 하며, 무언가 잘못됐지만 실패가 발생한 사실에 동의하지 못하는 경우다.

클라이언트가 적절한 조치를 취할 수 있는 방식으로 에러를 반환하기 위한 더 풍부한 의미 체계를 갖추는 것이 중요하다.

HTTP는 그 중요성을 잘 이해하는 프로토콜의 한 예다. 400번대 에러 코드는 요청에러며, 본질적으로 다운스트림 서비스는 원래부터 요청에 문제가 있다는 사실을 클라이언트에 알려준다. 이러한 경우 아마도 요청을 포기해야할 것이다. 예를 들어, 404 Not Found를 재시도할 필요는 없다. 500번대 응답 코드는 다운스트림 서버의 문제와 관련이 있으며, 일부 코드는 일시적인 문제라고 클라이언트에 알려준다. 예를 들어 503 Service Unavailable은 다운스트림 서버가 요청을 처리할 수 없지만 일시적인 상태일 수 있음을 나타내며, 이 경우 업스트림 클라이언트가 요청을 재시도할 수 있다. 반면에 클라이언트가 501 Not Implemented 응답을 받은 경우에는 재시도가 그다지 도움이 되지 않을 것이다.

 


마이크로서비스 통신 방식

  • 동기식 블로킹: 마이크로서비스는 다른 마이크로서비스를 호출하고 응답을 기다리는 작업을 차단하다.
  • 비동기식 논블로킹: 호출을 보낸 마이크로서비스는 호출 수신 여부에 관계없이 처리를 계속할 수 있다.
  • 요청 및 응답: 마이크로서비스는 작업을 수행하도록 다른 마이크로서비스에 요청을 보낸다. 결과를 알려주는 응답을 받을 것을 기대한다.
  • 이벤트 기반: 마이크로서비스는 다른 마이크로서비스가 소비하고 반응하는 이벤트를 발산한다. 이벤트를 발행하는 마이크로서비스는 자신이 발행하는 이벤트를 소비하는 마이크로서비스가 어떤 마이크로서비스인지 모른다.
  • 공통 데이터: 통신 방식으로 자주 볼 수 없는 마이크로서비스인 경우 일부 공유 데이터 소스를 통해 협업한다.

 

비동기식 논블로킹

비동기식 통신을 사용하면, 네트워크를 통해 호출을 보내는 행위가 호출하는 마이크로서비스를 블로킹하지 않는다. 따라서 응답을 기다릴 필요 없이 다른 처리를 계속 할 수 있다. 비동기식 논블로킹 통신은 다양한 형태로 제공되지만, 여기서는 마이크로서비스 아키텍처에서 가장 일반적인 세가지 방식을 좀 더 자세히 살펴본다.

  • 공통 데이터를 통합 통신: 업스트림 마이크로서비스는 일부 공통 데이터를 변경하고 이 데이터는 나중에 하나 이상의 마이크로서비스에서 사용된다.
  • 요청 및 응답: 마이크로서비스는 다른 마이크로서비스에 작업 요청을 보낸다. 요청된 작업이 완료되면 성공 여부와 관계없이 업스트림 마이크로서비스는 응답을 수신한다. 특히, 업스트림 마이크로서비스의 어떤 인스턴슫고 응답을 처리할 수 있어야한다.
  • 이벤트 기반 상호작용: 마이크로서비스는 발행한 일에 대한 사실적 진술로 생각될 수 있는 이벤트를 브로드캐스트한다. 다른 마이크로서비스는 관심 있는 이벤트를 수신하고 적절히 대응한다.

 

댓글