프록시 로테이션 루프가 영원히 실행되지 않게 막기
Python 프록시 풀에 유한한 시도 예산을 주고, 연결 실패와 목적지 응답을 구분합니다.
프록시 풀은 단순한 장애를 바쁜 루프로 바꿀 수 있습니다. 주소를 고르고 실패하고, 다른 주소를 고르고 다시 실패합니다. 자체 네트워크가 끊겨 모든 엔드포인트에 도달할 수 없다면, 주소를 바꾸는 것으로는 원인을 절대 고칠 수 없습니다.
풀이나 무료 프록시 목록에서 첫 프록시를 고르기 전에 작업에 예산을 주세요. 유한한 시도 횟수, 제한된 연결 및 읽기 대기, 그리고 전체 작업의 마감 시각입니다. Requests 타임아웃은 문서화된 연결이나 읽기 동작을 제어하지만, 그 자체로 새 요청을 계속 보내는 루프를 제한하지는 않습니다.
무엇이 추가 시도를 받을 자격이 있는지 결정
- 거부된 프록시 연결은 다른 엔드포인트를 시도할 근거가 될 수 있습니다.
- 목적지 응답에는 고유한 해석이 필요합니다. HTTP 오류를 받는다는 것은 어떤 요청 경로가 완료되었음을 증명합니다.
- 프록시 인증 실패는 늘어나는 목록에 같은 자격 증명을 계속 퍼붓는 대신 엔드포인트와 계정을 확인해야 합니다.
시도 기록과 함께 원래 예외나 상태를 보관하세요. «모든 프록시가 실패했습니다»만 담은 최종 메시지는 실패의 원인이 같았는지조차 숨깁니다.
실제 요청마다 각 프록시의 상태를 점검하면 요청이 하나 더 늘어나고, 그래도 다음 요청이 성공할 것을 보장하지는 못합니다. 최근 상태 정보가 작업에 맞는 곳에서 재사용하고, 실제 작업이 스스로 결과를 보고하게 하세요.
재시도는 작업을 반복할 수 있다
읽기 전용 가져오기라면 다른 프록시로 옮기는 편이 전송을 다시 실행하는 것보다 보통 간단합니다. 구매나 양식을 보낸 뒤 연결이 끊기면 목적지가 이미 처리했을 수 있습니다. 작업을 반복하기 전에 서비스의 멱등성 메커니즘과 HTTP 재시도 규칙을 따르세요.
예산이 소진되면 쓸모 있는 실패를 반환하세요. 증거와 함께 멈추는 작업은 누군가 알아차릴 때까지 조용히 도는 작업보다 고치기 쉽습니다.