<!DOCTYPE html><html><head><style>body{font-family:Helvetica,Arial;font-size:13px}</style>
<style type="text/css">body { font-family:'Helvetica'; font-size:12px}</style>
</head>
<body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">On Mon, 07 Nov 2016 00:20:12 -0500, JackDrogon <jack.xsuperman@gmail.com> wrote:<br><br><blockquote style="margin: 0 0 0.80ex; border-left: #0000FF 2px solid; padding-left: 1ex"><div id="bloop_customfont" style="color: rgb(0, 0, 0); margin: 0px;"><div id="bloop_customfont" style="margin: 0px;"><font face="HelveticaNeue"><span style="font-size: 18px;">Hi, All:</span></font></div><div id="bloop_customfont" style="margin: 0px;"><font face="HelveticaNeue"><span style="font-size: 18px;"><span class="Apple-tab-span" style="white-space:pre">  </span>I need varnish to return data directly and update cache at every time when the backend is ok. I also need varnish to return the last normal beresq data from the cache when the backend is down. How shuold I do with varnish?</span></font></div><div id="bloop_customfont" style="margin: 0px;"><font face="HelveticaNeue"><span style="font-size: 18px;"><br></span></font></div><div id="bloop_customfont" style="margin: 0px;"><font face="HelveticaNeue"><span style="font-size: 18px;">Thanks.</span></font></div></div></blockquote><br><div>Hi Jack,</div><div><br></div><div>There are a couple of ways to approach this (as there almost always are with a tool as flexible as Varnish).  If traffic is generally light, you could get away with something like this:<br></div><div><br></div><div>in vcl_backend_response, set</div><div><br></div><div>beresp.ttl = 1ms;</div><div>beresp.keep = 0s;</div><div>beresp.grace = 1h; # or as long as you would want to serve from cache during an outage</div><div><br></div><div>The very short TTL should translate into no hits as long as you don't get a lot of requests within a 1ms window.   But this might not be exactly the behavior you want.</div><div><br></div><div>If you have a heavily loaded scenario where you would get multiple hits in this period, then you could simply put some logic into vcl_hit that looks at the backend health, and forces a cache miss if the backend is healthy, and otherwise honors the TTL/grace periods.  In this scenario it wouldn't matter as much what the TTL value is, but beresp.keep should stay set to 0s.</div><div><br></div><div>in vcl_recv,</div><div><br></div><div>if ( std.healthy(req.backend_hint) ) {</div><div>   set req.http.allow-caching = "no";</div><div>} else {</div><div>   set req.http.allow-caching = "yes";</div><div>}</div><div><br></div><div>in vcl_hit</div><div><br></div><div> if ( req.http.allow-caching == "no" ) {</div><div>    return (fetch);</div><div> }</div><div> //... otherwise, carry on with the rest of the normal vcl_hit comparisons of ttl, grace, and keep...</div><div><br></div><div>Of course these examples don't take into account the behavior of what to do with set-cookie and other headers on the response, but for simplicity I'm assuming here that it's ok to cache the responses as-is.  You could always strip headers out during vcl_deliver on the basis of the req.http.allow-caching header, or more generically on the obj.hits counter, if necessary.</div><div><br></div><div>Best,</div><div>Mark</div></body></html>