我使用清漆作为我的直播内容的缓存。我在后端有一个视频服务器(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分钟或更短。
我做错了什么?
非常感谢
答案 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秒钟的数据,这通常是大量可用的方式。有趣的是,似乎玩家会等到清单显示新的块来继续播放,我想这就是延迟累积的方式。通常情况下实际上更糟,因为一旦读取完最新块,如果没有新块,玩家就会完全停止。