패스틀리(Fastly), 스트리밍 설정의 가이드라인
이번 블로그는 패스틀리에서 스트리밍 서비스를 위한 설정의 가이드라인에 대해서 설명합니다. 아래의 패스틀리의 Doc를 기반으로 블로그를 작성했습니다. 관심 있는 분은 아래 링크로 들어가시면 더 자세한 내용을 보실 수 있습니다.
https://docs.fastly.com/en/guides/streaming-configuration-guidelines
Streaming configuration guidelines | Fastly Help Guides
The Fastly network can deliver live streams for any HTTP streaming technology, archived or recorded, on any public or private cloud storage service. When configuring VCL to deliver live streams, we recommend following these guidelines, which Customer Suppo
docs.fastly.com
패스틀리의 서비스는 어떠한 타입의 http streaming 테크놀로지라도 서비스가 가능하며, 아래의 내용은 패스틀리가 추천하는 기본 설정을 위한 가이드 라인입니다.
실드(Shield) 설정하기
패스틀리에서는 Shield라고 불리는 설정이 가능하며, 오리진에 가까운 곳에 위치한 POP을 실드로 설정해 주므로써 오리진에 엑세스하는 Cache 서버를 줄여주는 것으로 오리진 부하를 낮출 수 있습니다.
비디오 manifest 및 segment caching TTLs 설정
Http Streaming시에 사용되는 manifests 파일은 수시로 갱신되며, 해당 파일이 장시간 Cache 서버에 Caching되어 있을 경우 Video에 접속하는 유저는 정상적으로 해당 동영상을 시청하지 못할 수도 있습니다. 아래의 VCL code와 같이 유저에게 서비스되는 확장자 별로 서로 다른 TTL을 설정하는 것을 권장하고 있으며, manifests파일에는 1s, 동영상 segment 파일에는 3600s의 TTL을 권장하고 있습니다.
sub vcl_fetch {
#FASTLY fetch
# Set 1s ttls for video manifest and 3600s ttls for segments of HTTP Streaming formats.
# Microsoft Smooth Streaming format manifest and segments do not have file extensions.
# Look for the keywords "Manifest" and "QualityLevel" to identify manifest and segment requests.
if (req.url.ext ~ "m3u8|mpd" || req.url.path ~ "Manifest") {
set beresp.ttl = 1s;
return (deliver);
}
else {
if (req.url.ext ~ "aac|dash|m4s|mp4|ts" || req.url.path ~ "QualityLevel") {
set beresp.ttl = 3600s;
return (deliver);
}
}
return (deliver);
}
에러 http response code에 대한 TTL 설정
Http streaming은 동영상이 유저에게 서비스 되면서 manifest파일과 Segment파일이 수시로 갱신됩니다. 만약 갱신되지 않은 파일에 대한 요청이 발생할 경우 500 혹은 503 error가 발생할 것 입니다. Fastly Cache에서는 특정 http response code이외에는 caching하지 않기 때문에 5XX 에러에 대해서는 기본적으로 Caching되지 않기 때문에 해당 Response code에 대해서 짧은 시간이라도 Caching을 하게 된다면, 오리진에서 파일을 준비되기까지 불필요한 접근을 줄 일 수 있을 것입니다. 아래와 같은 VCL code로 200, 206이의외 http response코드에 대해서 1초로 caching하도록 설정할 수 있습니다.
sub vcl_fetch {
#FASTLY fetch
# Set 1s ttl if origin response HTTP status code is anything other than 200 and 206
if (!http_status_matches(beresp.status, "200,206")) {
set beresp.ttl = 1s;
set beresp.cacheable = true;
return (deliver);
}
return (deliver);
}
Streaming Miss 설정
보통 동영상 파일은 작게는 수십Mbye에서 크게는 수십Gbyte의 사이즈로 유저에게 서비스 됩니다. Fastly 에는 Segment caching이라는 설정이 있으며, 해당 설정을 하면 큰 파일을 작은 단위로 잘라서 Caching하게 됩니다. 이 기능을 쓰지 않을 경우에는 Caching가능한 파일 사이즈가 20Mbyte로 제한되므로, 큰 파일이 제대로 Caching되지 않아 CHR에 영향을 미치게 됩니다. 그러므로 20Mbyte이상의 큰 동영상 파일을 메인으로 서비스 하는 경우에는 아래의 VCL code와 같이 Segment Cache기능을 확장자 단위로 설정하면 Caching효율을 크게 높일 수 있습니다.
sub vcl_fetch {
#FASTLY fetch
# Enable Streaming Miss only for video or audio objects.
# Below conditions checks for video or audio file extensions commonly used in
# HTTP Streaming formats.
if (req.url.ext ~ "aac|dash|m4s|mp4|ts") {
set beresp.do_stream = true;
}
return (deliver);
}
Automatic Gzipping설정
Manifest파일의 내용은 text로 구성되어 있습니다. Manifest파일에 대해서 gzip 되도록 설정하면 전송량을 줄 일수 있어서 조금이라도 빨리 파일을 유저에게 전달 할 수 있게 됩니다.
HTTP streaming format | file extension | content-type |
Apple HLS | m3u8 | application/x-mpegurl, application/vnd.apple.mpegurl |
MPEG-DASH | mpd | application/dash+xml |
Adobe HDS | f4m, bootstrap | application/f4m (for manifest), application/octet-stream (for bootstrap) |
Microsoft HSS | N/A | application/vnd.ms-sstr+xml |
마치며
간단하게 Fastly CDN에서 스트리밍 설정을 할때 추천하는 설정들에 대해서 알아봤습니다. 상기에 소개드린 URL로 들어가시면 더 많은 정보들을 참고하실 수 있습니다. 끝까지 읽어 주셔서 감사합니다.