我们目前正在编写一个 Varnish 实现,看看它是否适合放在我们的 Rails 应用程序前面。
我们希望 Varnish 缓存 API 调用的结果,并且仅在客户端的 ETag 与 Varnish 中存储的不匹配或客户端的修改日期早于 Varnish 的日期时才访问应用程序。
到目前为止,我还没有看到 Varnish 将这些值考虑在内。
当辅助请求在最大期限内时,我们只会获得缓存命中。
这是预期的行为吗?
我们目前正在编写一个 Varnish 实现,看看它是否适合放在我们的 Rails 应用程序前面。
我们希望 Varnish 缓存 API 调用的结果,并且仅在客户端的 ETag 与 Varnish 中存储的不匹配或客户端的修改日期早于 Varnish 的日期时才访问应用程序。
到目前为止,我还没有看到 Varnish 将这些值考虑在内。
当辅助请求在最大期限内时,我们只会获得缓存命中。
这是预期的行为吗?
这是预期的行为,Varnish 当前不会重新验证缓存的内容。
有一些实验性的工作可以做你想做的事,这可能会也可能不会在 Varnish 4.0 中结束(几个月后)。
与此同时,您可以做的是人为设置一个较短的 TTL,并设置一个grace
与您想要的 TTL 相等的时间。使用该配置,当请求进入 Varnish 时,会向后端发送一个 IMS 请求(当然,只要缓存的条目有一个 ETag,否则它将是一个普通请求)。
副作用是,如果后端关闭或返回 500,Varnish 也会发送缓存条目——这可能是也可能不是你想要的。
我所做的是将 hash() 函数设置为使用提供的 etag。
这意味着对对象的第一个请求(客户端未提供 etag)将获取对象本身。
任何后续请求,或任何为 etag 提供标头的请求,都将获得一个对象或 304。