분산 서비스에서 "재시도"를 피하는 방법은 무엇입니까?


10

"재시도 스톰"은 클라이언트가 포기하기 전에 설정된 횟수만큼 재 시도하도록 구성 될 때 발생합니다. 서비스의 정상적인 작동에서 패킷 손실이 발생하기 때문에 재시도 정책이 필요합니다.

이 예제를 보자 :

샘플 아키텍처

예를 들어 전체 서비스가 초당 80,000 건의 요청을 지원하고 용량의 약 80 %로 실행되도록 확장 된 경우, 서비스가 초당 101,000 건의 요청을 수신하게하는 트래픽 급증으로 인해 해당 요청 중 1,000 건이 실패 할 수 있습니다.

재시도 정책이 시작되면 실패가 감지 된 위치에 따라 초당 최대 102,000 건의 요청으로 서비스를 푸시하는 추가 1,000 건 이상의 요청이 발생합니다. 초당 실패한 요청 수

예상되는 최대 트랜잭션을 넘어서는 대규모의 초과 프로비저닝 서비스 외에는 비효율적입니다. "재시도 폭풍"을 피하기 위해 어떤 전략을 사용할 수 있습니까?


100kQPS가 용량의 80 % 인 경우 101kQPS는 1k 오류가 발생하지 않아야하며, 오류가 발생하지 않아야합니다. 초과 프로비저닝의 시점이 아닙니까?
Adrian

@Adrian 당신의 권리, 그것은 요점을 설명하기 위해 고안된 예였습니다-나는 지나치게 추상적이지 않고 내 요점을 분명히하기 위해 충분히 환원하려고 노력했습니다. "10 만 지원으로 조정"을 "80,000 지원으로 조정"으로 수정했습니다.
Richard Slater

답변:


7

피하려고하는 것에 달려 있습니다.

진정으로 중요한 서비스 인 서비스 중단을 피하려는 경우 ( "API 호출이 적절하게 제공되지 않으면 사람들이 죽을 것"이라는 관점에서) 전용 리소스를 프로비저닝하는 것보다 그렇습니다. 이들은 트래픽 급증을 허용하지 않는 여러 가지 서비스 스파이 킹으로 인해 중단이 발생할 수 있습니다.

서비스 중단이 발생할 가능성 이 훨씬 높은 시나리오에서는 클라이언트와 서버 측 모두에서 문제를 해결할 수 있습니다. 트래픽을 처리하지 않고 (자원을 소비하는) 트래픽이 재 시도인지 알 수 없기 때문에 실제로 많은 트래픽에 대한 문제를 실제로 해결하는 것은 논리적으로 불가능하다는 점은 주목할 만하지 만 성공적이지만 잘못 처리 된 요청에 대한 재시도 클라이언트가 DDOS 등의 경우에는 영향을 줄 수 있습니다 .

에서 클라이언트 코드 상한과 우아하게 실패하는 메커니즘을 가지고 합리적인 재시도 논리를 작성. 이렇게하면 사용자가 실패한 요청의 무한 루프에 빠지지 않고 잠시 동안 방금 수행 한 작업을 시도하도록 오류를 제공합니다.

당신을 위해 서버 측 인프라 가장 간단한 해결책은 스로틀이다. 요청에 대한 엄격한 제한, 특히 특정 사용 사례를 기반으로 논리적으로 요청하고 분산시킬 수있는 경우 (예 : 중앙 집중식 서비스가 어려운 결정을 내리는 경우 지리적으로 먼 요청을 차단하여 스레드가 중단 될 수 있음) 서버 측 또는 불가피하지만 사소한 중단을 고르게 분배하고 싶습니까? 등) 기본적으로 게이트웨이에서 의도적으로 503을 반환하는 것이 요청을 통과시키고 504를 보내는 것보다 훨씬 저렴하다는 사실로 요약합니다. 어쨌든. 기본적으로 고객이 현재 제공 할 수있는 내용을 기반으로 클라이언트가 동작하도록하고 올바른 응답을 제공하여 클라이언트가 적절하게 대응할 수 있도록합니다.


5

이러한 재시도 폭풍을 방지하는 한 가지 방법은 백 오프 메커니즘을 사용하는 것입니다.

로부터 것은 재시도에 백 오프 구현 구글 앱 엔진의 섹션 규모에 대한 설계 가이드 :

Cloud Datastore와 같은 서비스 또는 URL 가져 오기 또는 소켓 API를 사용하는 외부 서비스를 호출하는지 여부에 관계없이 코드가 실패하면 다시 시도 할 수 있습니다. 이러한 경우, 천둥 무리 문제 를 피하기 위해 항상 무작위 지수 백 오프 정책을 구현해야합니다 . 또한 최대 재시도 한계에 도달 한 후 총 재시도 횟수와 처리 실패를 제한해야합니다.

대부분의 GAE API에는 기본적으로 이러한 백 오프 메커니즘 / 정책이 활성화되어 있습니다.


감사합니다. 백 오프 메커니즘을 구현하는 것이 좋습니다. 일반적으로 과도 오류 처리 응용 프로그램 블록을 사용하여 구성 가능한 지수 백 오프를 수행합니다 . 그러나 Azure에서 하이퍼 스케일 애플리케이션을 운영하는 5 년 이상의 운영 경험을 통해 "재시도 폭풍"이 기하 급수적으로 발생하는 경우에도 여전히 자주 발생합니다.이를 피하기위한 실행 가능한 전략을 찾지 못했습니다.
Richard Slater
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.