使用varnish缓存在HLS上获得延迟

时间:2018-04-03 01:29:35

标签: varnish varnish-vcl varnish-4

我使用清漆作为我的直播内容的缓存。我在后端有一个视频服务器(Mistserver),端口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 / varnish / secret -s malloc,1G -t 3 -p thread_pool_timeout = 30 < / p>

问题:内容正在被缓存,显然是正确的。但是经过一段时间后,我就会在5分钟的原始流中获得时间上的差异。所以例如如果实时流有时间22:25,我可能会在输出流中看到时间22:20。我不能在直播中拥有这样的时差。

我尝试过清除缓存,但没有用。有时它是correclty synchronized,如果我重新启动视频服务器和清漆。 我需要的是避免缓存超过1分钟或更短

我做错了什么?

非常感谢

1 个答案:

答案 0 :(得分:0)

(这里不是您的问题,但是:我将删除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;
    }
}

注意:您不希望清漆传递的清单滞后于真实的清单。当前的设置可以传送30秒钟的数据,这通常是大量可用的方式。有趣的是,似乎玩家会等到清单显示新的块来继续播放,我想这就是延迟累积的方式。通常情况下实际上更糟,因为一旦读取完最新块,如果没有新块,玩家就会完全停止。