使用VARNISH CACHE延迟HLS



我正在使用varnish作为我的实时流媒体内容的缓存。我在后端有一个视频服务器(Misterver(,在端口8090上输出HLS。

`vcl 4.0;
import std;
backend default {
    .host = "127.0.0.1";
    .port = "8090";
}
acl purge {
    "127.0.0.1";
}
sub vcl_recv {
    if(req.method == "PURGE"){
        if (!client.ip ~ purge) {
            return(synth(405,"Not allowed."));
        }
        return (purge);
    }
    return (hash);
}
sub vcl_hash {
   return (lookup);
}
sub vcl_hit {
    if (obj.ttl >= 0s) {
        return (deliver);
    }
    if (std.healthy(req.backend_hint)) {
        if (obj.ttl + 10s > 0s) {
            return (deliver);
        }
        else {
            return(fetch);
        }
    }
    else {
        if (obj.ttl + obj.grace > 0s) {
            return (deliver);
        }
        else {
            return (fetch);
        }
    }
    return (fetch); # Dead code, keep as a safeguard
}
sub vcl_purge{
}
sub vcl_pipe {
    return (pipe); 
}
sub vcl_init {
    return (ok);
}
sub vcl_fini {
    return (ok);
}
sub vcl_backend_response {
    set beresp.http.Access-Control-Max-Age = 15;
    set beresp.ttl = 15s;
    set beresp.grace = 15s;
}`

和Varnish正在执行30秒的线程池超时:

/usr/sbin/varnishd -a:6081 -t localhost:6082 -f/etc/varnish/user.vcl -s/etc/etc/etc/varnish/secret -s malloc -s malloc,1G -t 3 -p thread_porth_pool_pool_time_time = 30 <30

问题:内容显然是正确的,正确,正确。但是一段时间后,流正在运行,我的原始流是5分钟的时间。因此,例如,如果实时流有时间22:25,我可能会在输出流中看到时间22:20。我在直播中不能有这样的时间差异。

我尝试清除缓存,但没有起作用。如果我同时重新启动视频服务器和清漆,有时会更换同步。我需要的是避免使用MOR超过1分钟或更短的

我在做什么错?

谢谢

(不是您在这里的问题,而是:我删除vcl_hit部分,它可能对您无济于事(

对于实时视频,清单需要仔细处理,从本质上讲,您想尽可能少地落后。因此,第一件事是杀死恩典,第二件事是将TTL缩短到一半的时间。

尝试以下内容:

vcl 4.0;
import std;
backend default {
    .host = "127.0.0.1";
    .port = "8090";
}
acl purge {
    "127.0.0.1";
}
sub vcl_recv {
    if(req.method == "PURGE"){
        if (!client.ip ~ purge) {
            return(synth(405,"Not allowed."));
        }
        return (purge);
    }
    return (hash);
}
sub vcl_backend_response {
    if (bereq.url ~ "m3u8") {
        # assuming chunks are 2 seconds long
        set beresp.ttl = 1s;
        set beresp.grace = 0s;
    } else {
        set beresp.ttl = 10m;
        set beresp.grace = 5m;
    }
}

注意:您不希望Varnish交付的清单落在真实的落后。当前的设置可以传递30秒钟的数据,这通常是直播的方式。有趣的是,玩家似乎只会等到清单显示新的块以恢复播放,我想这就是延迟的积累方式。通常情况下,情况实际上更糟,因为玩家一旦没有新的块就读了最新的块。

最新更新