CDN – 504 Handling

문제점

하나의 CDN farm에서 여러 origin을 캐싱할 때 처리 지연은 문제를 발생 시킵니다.

캐시 서버에서 miss가 발생해서 origin으로 부터 데이터를 가지고 올 때, origin이 부하가 심한 경우 응답처리가 늦어질 수 있습니다. 응답처리가 늦어지는데 계속해서 추가 요청이 들어오면 캐시 서버는 타임아웃이 발생할 때까지 소켓이 점유된 상태로 남게 됩니다. 요청이 많은 캐시 서버에서 이러한 현상이 지속될 경우 소켓 고갈로 인해 다른 origin으로의 요청까지 영향을 받게 됩니다.


개념

proxy_next_upstream

proxy_read_timeout


해결방법

제가 관리하는 CDN은 Nginx + Apache Trafficserver 구성이었습니다. 앞서 설명한 directive를 통해서 문제를 해결 하였습니다. 사용 예시는 아래와 같습니다.

server {
    listen 80;
    proxy_next_upstream timeout error http_504;
    location / {
        proxy_read_timeout 3s;
        proxy_pass http://origin;
    }
}

호기심

큰 파일의 경우 처리 시간이 오래걸리기 때문에, proxy_read_timeout으로 인하여 504 응답코드를 받을 것이라고 생각 했습니다. 테스트를 위해서 Origin에 1GB 파일을 만들어두고 curl로 파일을 받아보았습니다.

테스트 결과 큰 파일을 받아오는 중에 일부 패킷이 정상적으로 들어오기만 한다면 proxy_read_timeout이 발생하지 않는 것을 확인 했습니다. 비교를 위해 패킷이 오지 않도록 origin 역할을 하는 nginx에 echo_sleep을 설정하면 타임아웃이 발생되었습니다.

정리하면 proxy_read_timeout 사용 시, origin 부하가 심해서 요청 서버에 아무런 패킷도 전송하지 못할 시 타임아웃이 발생하면서 backup 서버로 요청되지만, 단순히 파일 크기가 커서 지연이 발생하는 경우는 기존 서버에 계속해서 요청이 간다는 것입니다.