애플리케이션 및 인프라 복원력
복원력은 일시적인 오류로부터 복구하는 기능입니다. 앱의 복구 전략은 사용자에게 미치는 영향을 최소화하면서 일반 함수를 복원합니다. 오류는 클라우드 환경에서 발생할 수 있으며 앱은 가동 중지 시간 및 데이터 손실을 최소화하는 방식으로 응답해야 합니다. 이상적인 상황에서 앱은 사용자가 문제가 있다는 것을 알지 못하고 오류를 정상적으로 처리합니다.
마이크로 서비스 환경은 일시적일 수 있으므로 부분 오류를 예상하고 처리하도록 앱을 디자인합니다. 예를 들어 부분 오류에는 코드 예외, 네트워크 중단, 응답하지 않는 서버 프로세스 또는 하드웨어 오류가 포함될 수 있습니다. Kubernetes 클러스터 내의 다른 노드로 컨테이너를 이동하는 것과 같은 계획된 활동조차도 일시적인 오류를 일으킬 수 있습니다.
복원력 접근 방식
복원력 있는 애플리케이션을 디자인할 때는 실패하는 속도와 정상 성능 저하 중에서 선택해야 하는 경우가 많습니다. 빠르게 실패한다는 것은 문제가 발생할 때 애플리케이션이 문제를 복구하거나 해결하려고 시도하지 않고 즉시 오류 또는 예외를 발생시킨다는 것을 의미합니다. 이렇게 하면 문제를 빠르게 식별하고 해결할 수 있습니다. 정상 성능 저하는 일부 구성 요소가 실패하더라도 애플리케이션이 제한된 용량에서 계속 작동하려고 한다는 것을 의미합니다.
클라우드 네이티브 애플리케이션에서는 서비스가 즉각 실패하기보다는 문제가 발생했을 때 부드럽게 처리하는 것이 중요합니다. 마이크로 서비스는 분산되고 독립적으로 배포할 수 있으므로 부분 오류가 예상됩니다. 빠르게 실패하면 한 서비스의 오류가 종속 서비스를 신속하게 중단하여 전체 시스템 복원력을 줄일 수 있습니다. 대신 내부 및 외부 서비스 오류를 예측하고 허용하도록 마이크로 서비스를 코딩해야 합니다. 이러한 정상적인 성능 저하를 통해 일부 서비스가 중단된 경우에도 전체 시스템이 계속 작동할 수 있습니다. 중요한 사용자 연결 함수를 지속하여 완전한 중단을 방지할 수 있습니다. 우아한 실패는 방해된 서비스를 시스템의 다른 부분에 영향을 미치기 전에 복구하거나 자체적으로 치유할 시간을 제공합니다. 따라서 마이크로 서비스 기반 애플리케이션의 경우 정상 성능 저하는 오류 격리 및 신속한 복구와 같은 복원력 모범 사례에 더 잘 부합합니다. 로컬 인시던트가 시스템 전체에서 연속되지 않도록 방지합니다.
복원력으로 정상 성능 저하를 지원하는 두 가지 기본 방법인 애플리케이션 및 인프라가 있습니다. 각 접근 방식에는 이점과 단점이 있습니다. 두 방법 모두 상황에 따라 적절할 수 있습니다. 이 모듈에서는 코드 기반 복원력과 인프라 기반 복원력을 모두 구현하는 방법을 설명합니다.
코드 기반 복원력
코드 기반 복원력을 구현하기 위해 .NET에는 복원력 및 일시적인 오류 처리를 위한 확장 라이브러리가 Microsoft.Extensions.Http.Resilience
있습니다.
유창하고 이해하기 쉬운 구문을 사용하여 스레드로부터 안전한 방식으로 오류 처리 코드를 빌드합니다. 오류 처리 동작을 정의하는 몇 가지 복원력 정책이 있습니다. 이 모듈에서는 HTTP 클라이언트 작업에 재시도 및 회로 차단기 전략을 적용합니다.
재시도 전략
재시도 전략은 이름이 의미하는 것과 정확히 맞습니다. 오류 응답이 수신되면 잠시 기다린 후 요청이 다시 시도됩니다. 다시 시도할 때마다 대기 시간이 증가합니다. 증가는 선형 또는 지수일 수 있습니다.
최대 재시도 횟수에 도달하면 전략은 포기하고 예외를 발생시킵니다. 사용자의 관점에서 앱은 일반적으로 일부 작업을 완료하는 데 더 오래 걸립니다. 또한 앱이 작업을 완료할 수 없다는 사실을 사용자에게 알리기까지 시간이 걸릴 수 있습니다.
회로 차단기 전략
회로 차단기 전략은 통신을 일시 중지하여 반복된 실패 횟수 후에 대상 서비스에 중단을 제공합니다. 서비스에 심각한 문제가 발생하여 일시적으로 대응할 수 없습니다. 정의된 연속 실패 횟수가 지나면 연결 시도가 일시 중지되고 회로가 열립니 다. 이 대기 중에는 서비스에 연결하지 않고도 대상 서비스에 대한 추가 작업이 즉시 실패합니다. 대기 시간이 경과하면 작업이 다시 시도됩니다. 서비스가 성공적으로 응답하면 회로가 닫히고 시스템이 정상으로 돌아갑니다.
인프라 기반 복원력
인프라 기반 복원력을 구현하려면 서비스 메시를 사용할 수 있습니다. 서비스 메시는 코드를 변경하지 않고 복원력 외에도 트래픽 관리, 정책, 보안, 강력한 ID 및 관찰 가능성을 제공합니다. 앱은 인프라 계층으로 이동되는 이러한 운영 기능에서 분리됩니다.
코드 기반 접근 방식과 비교
인프라 기반 복원력 접근 방식은 실시간으로 클러스터 조건에 동적으로 적응할 수 있는 메트릭 기반 보기를 사용할 수 있습니다. 이 방법은 클러스터 관리에 다른 차원을 추가하지만 코드를 추가하지는 않습니다.
코드 기반 접근 방식을 사용하면 다음을 수행할 수 있습니다.
- 적절한 재시도 및 시간 제한 매개 변수를 추측하는 데 필요합니다.
- 특정 HTTP 요청에 집중합니다.
앱 코드에서 인프라 오류에 응답하는 합리적인 방법은 없습니다. 동시에 처리되는 수백 또는 수천 개의 요청을 고려합니다. 지수적 백오프(요청 횟수만큼)로 재시도해도 서비스가 과부하될 수 있습니다.
반면 인프라 기반 접근 방식은 앱 내부를 인식하지 못합니다. 예를 들어 복잡한 데이터베이스 트랜잭션은 서비스 메시에 보이지 않습니다. 이러한 트랜잭션은 코드 기반 접근 방식을 사용하여 오류로부터만 보호할 수 있습니다.
예정된 단위에서는 코드에서 .NET HTTP 복원력과 Linkerd 서비스 메시를 사용하여 마이크로 서비스 기반 앱에 대한 복원력을 구현합니다.