2009-06-10 2 views
1

사용자가 시스템에서 검색 할 때마다 외부 시스템에 요청을 보내야하는 시스템이 있습니다.클라이언트 서버 시스템에서 백 오프 메커니즘을위한 패턴

외부 시스템이 다운되었거나 비정상적으로 응답하는 데 시간이 오래 걸리는 경우 잠시 시스템을 "back off"하고 싶습니다. 외부 시스템에 더 많은 요청을하는 대신, 시스템의 사용자가 즉시 요청을 처리하지 않도록 즉시 알리고 싶습니다.

이렇게하면 사용자 환경이 더 좋아지며 (시간 초과를 기다릴 필요가 없음) 내 시스템에서 리소스 사용량이 줄어 듭니다 (스레드는 외부 시스템에서 응답 또는 시간 초과를 기다리지 않고 바쁠 것입니다). 그것은 외부 시스템을 보호 할 것입니다. (이미 부하로 인해 어려움을 겪고있는 상황)

잠시 후 또는 내 시스템에서 외부 시스템이 다시 응답하고 있음을 발견하면 정상적인 작동을 다시 시작하고 싶습니다.

이런 종류의 일을하는 데 필요한 패턴이나 표준 방법이 있습니까? 특히 타임 아웃/롱 요청을 추적하기위한 메커니즘, 그리고 다시 시도하기 시작할 때 필요한 제어 메커니즘.

답변

2

문학에 묘사 된 내용은 기억이 나지 않지만 "일정 대기열"에있는 이러한 작업 센터에서 발견 한 패턴 - 다양한 일이 생기는 방식 (== 함수 또는 메서드 호출 (파이썬의 sched 표준 라이브러리 모듈). 백엔드에 (비동기) 요청을 보내면 지금부터 X 초 동안 시간 초과 이벤트를 예약합니다. 요청 객체는 예약 된 시간 초과 ID (그 전에 요청이 만족되면 취소하기 위해) 또는 보류중인 요청 집합도 유지합니다 (따라서 시간 초과는 실제로 필요하지 않을 때를 압니다). 이는 좋은 것입니다 아이디어는 어쨌든 "실제로 시간 초과를 의미하는"처리를보다 쉽게 ​​만듭니다 (아래 참조).

시간 초과가 발생하면 앞으로 Y 초 동안 재 시도를 예약하고 이후 대기중인 모든 보류중인 요청을 해당 컨테이너에서 재 시도 할 요청 컨테이너로 이동합니다 (시스템 재부팅을 시도하면 다른 모든 시간 초과가 취소됩니다) 설정되어 있음) 알림을 보내고 대기중인 모든 클라이언트에게 "백엔드가 느립니다. Y 초 후에 다시 시도합니다"라는 알림을 보냅니다.

재시도 이벤트가 발생하는 경우 등 시스템이 일시 중단 된 상태에서 새 요청이 도착하면 "다시 시도"함으로 이동합니다.

이 패턴을 찾을 수는 없지만 어쨌든 Schmidt's excellent book ... 어쨌든 읽는 것이 좋습니다! -)

관련 문제