我正在使用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秒钟的数据,这通常是直播的方式。有趣的是,玩家似乎只会等到清单显示新的块以恢复播放,我想这就是延迟的积累方式。通常情况下,情况实际上更糟,因为玩家一旦没有新的块就读了最新的块。