팁 (조언)
이 콘텐츠는 .NET Docs 또는 오프라인으로 읽을 수 있는 다운로드 가능한 무료 PDF로 제공되는 컨테이너화된 .NET 애플리케이션용 .NET 마이크로 서비스 아키텍처인 eBook에서 발췌한 내용입니다.
마이크로 서비스 기반 애플리케이션과 같은 분산 시스템에서는 부분 실패의 위험이 항상 존재합니다. 예를 들어 단일 마이크로 서비스/컨테이너가 실패하거나 짧은 시간 동안 응답할 수 없거나 단일 VM 또는 서버가 충돌할 수 있습니다. 클라이언트와 서비스는 별도의 프로세스이므로 서비스가 클라이언트의 요청에 적시에 응답하지 못할 수 있습니다. 서비스가 오버로드되고 요청에 매우 느리게 응답하거나 네트워크 문제로 인해 짧은 시간 동안 액세스할 수 없을 수 있습니다.
예를 들어 eShopOnContainers 샘플 애플리케이션의 주문 세부 정보 페이지를 고려합니다. 사용자가 주문을 제출하려고 할 때 주문 마이크로 서비스가 응답하지 않는 경우 클라이언트 프로세스(MVC 웹 애플리케이션)의 잘못된 구현(예: 클라이언트 코드가 시간 제한 없이 동기 RPC를 사용하는 경우)은 응답을 무기한 대기하는 스레드를 차단합니다. 잘못된 사용자 환경을 만드는 것 외에도 응답하지 않는 모든 대기는 스레드를 사용하거나 차단하며, 스레드는 확장성이 뛰어난 애플리케이션에서 매우 중요합니다. 차단된 스레드가 많은 경우 결국 애플리케이션의 런타임이 스레드가 부족할 수 있습니다. 이 경우 그림 8-1에 표시된 것처럼 애플리케이션이 부분적으로 응답하지 않고 전역적으로 응답하지 않게 될 수 있습니다.
그림 8-1. 서비스 스레드 가용성에 영향을 주는 종속성으로 인한 부분 오류
대규모 마이크로 서비스 기반 애플리케이션에서는 특히 대부분의 내부 마이크로 서비스 상호 작용이 동기 HTTP 호출(안티패턴으로 간주됨)을 기반으로 하는 경우 부분 오류를 증폭할 수 있습니다. 하루에 수백만 건의 수신 전화를 받는 시스템을 생각해 보세요. 시스템에 동기 HTTP 호출의 긴 체인을 기반으로 하는 잘못된 디자인이 있는 경우 이러한 수신 호출은 동기 종속성으로 수십 개의 내부 마이크로 서비스에 수백만 건의 발신 호출(1:4의 비율을 가정해 보겠습니다)이 발생할 수 있습니다. 이 상황은 그림 8-2, 특히 종속성 #3에 표시되어 체인을 시작하고 종속성 #4를 호출한 다음 #5를 호출합니다.
그림 8-2. HTTP 요청의 긴 체인을 특징으로 하는 잘못된 디자인이 있는 경우의 영향
모든 종속성 자체에 뛰어난 가용성이 있더라도 분산 및 클라우드 기반 시스템에서 일시적인 오류가 보장됩니다. 그것은 당신이 고려해야 할 사실이다.
내결함성을 보장하기 위해 기술을 설계하고 구현하지 않으면 작은 가동 중지 시간도 증폭될 수 있습니다. 예를 들어 가용성의% 99.99인 50개의 종속성은 이러한 파급 효과로 인해 매달 몇 시간의 가동 중지 시간을 발생시킬 수 있습니다. 대량의 요청을 처리하는 동안 마이크로 서비스 종속성이 실패하면 해당 실패로 인해 각 서비스에서 사용 가능한 모든 요청 스레드가 빠르게 포화되고 전체 애플리케이션이 충돌할 수 있습니다.
그림 8-3. 동기 HTTP 호출의 긴 체인이 있는 마이크로 서비스에 의해 증폭된 부분 오류
이 문제를 최소화하기 위해 비동기 마이크로 서비스 통합 섹션에서 마이크로 서비스의 자율성을 적용하는 이 가이드에서는 내부 마이크로 서비스에서 비동기 통신을 사용하도록 권장합니다.
또한 부분 오류를 처리하도록 마이크로 서비스 및 클라이언트 애플리케이션을 설계하는 것이 중요합니다. 즉, 복원력 있는 마이크로 서비스 및 클라이언트 애플리케이션을 빌드하는 것이 중요합니다.
.NET