跳转到主要内容

p.a.caching 插件,提供更好的清理策略

项目描述

collective.purgebyid

Latest Version Supported - Python Versions Number of PyPI downloads License Tests Coverage

collective.purgbyid 是一个针对基于Plone的网站缓存无效化的新方法。它使用添加一个额外头部的想法,称为X-Ids-Involved,其中包含参与资源构建的对象的uuid。例如,一个图像只包含其uuid

% wget -S http://localhost:8080/Plone/image01
...
  X-Ids-Involved: #c8d7c0bc2b794325b916d990de91d7ee#

其他页面可能更复杂。然后,一个新的清理重写规则会将自定义URL添加到要清理的URL集合中:“按id清理”自定义URL的形式为/@@purgebyid/<UUID>,其中UUID是要清理的对象的uuid。

最后,Varnish 配置为,当 URL /@@purgebyid/<UUID> 被清除时,它将禁止所有匹配正确类型(即包含要清除的资源 uuid)的 X-Ids-Involved 标头的对象。这意味着当资源被清除时,清除它自己的 /@@purgebyid/<UUID> URL 就足够了,因为 Varnish 将负责在访问它的 URL 所使用的任何时候捕获资源的所有出现。

Varnish 没有使用 xkey varnish 模块

在没有 xkey 模块的情况下,清除资源的方法是禁止所有具有包含要清除资源 id 的 X-Ids-Involved �头的对象。

为了更好地理解两种方法(禁止与清除)之间的区别,请阅读:https://varnish-cache.org/docs/trunk/users-guide/purging.html

配置示例

sub vcl_recv {
  if (req.method == "PURGE") {
     if (!client.ip ~ purge) {
        return (synth(405, "This IP is not allowed to send PURGE requests."));
     }
     if (req.url ~ "^/@@purgebyid/") {
        ban("obj.http.x-ids-involved ~ #" + regsub(req.url, "^/@@purgebyid/", "") + "#");
        return(synth(200, "Ban added"));
    }
    return(purge);
  }
}

sub vcl_deliver {
    unset resp.http.x-ids-involved;
}

Varnish 使用 xkey varnish 模块

默认情况下,Varnish 使用 URL 作为清除的哈希键,但使用 xkey 模块(https://github.com/varnish/varnish-modules/blob/master/src/vmod_xkey.vcc)时,会有一个二级哈希来执行此操作。可以特别清除标记的缓存对象,以实现更精确的缓存控制。

要使 xkey 生效,必须提供一个特殊的 HTTP 标头“Xkey”,其中包含所有标签(用空格分隔)。在 vcl_backend_response 中添加少量代码将 X-Ids-Involved 标头转换为 XKey。

配置示例

import xkey;

sub vcl_recv {
    if (req.method == "PURGE") {
        if (!client.ip ~ purge) {
            return (synth(405, "This IP is not allowed to send PURGE requests."));
        }
        if (req.url ~ "^/@@purgebyid/") {
            set req.http.n-gone = xkey.purge(regsub(req.url, "^/@@purgebyid/", ""));
            # or: set req.http.n-gone = xkey.softpurge(regsub(req.url, "^/@@purgebyid/", ""));
            return (synth(200, "Invalidated "+req.http.n-gone+" objects"));
        }
    }
    return(purge);
}

sub vcl_backend_response {
    if (beresp.http.x-ids-involved) {
        set beresp.http.xkey = regsuball(beresp.http.x-ids-involved, "#", " ");
    }
}

sub vcl_deliver {
    unset resp.http.x-ids-involved;
    unset resp.http.xkey;
}

软清除与常规清除的区别在于,它重置对象的生命周期(TTL),但保留它以供优雅模式和条件请求使用,直到其配置的优雅时间和保持时间的剩余部分。

它如何工作?如何扩展它?

在发布过程中,通过订阅 IPubAfterTraversal 收集所有涉及的 ID(UUID 和自定义 ID)。

对于 IInvolvedID 的适配器非常重要,它们负责收集给定上下文中的 ID。基本实现寻找 UUID,但可能针对您的自定义内容类型进行特殊化。

除了适配器方法外,还有内联方法。您可以从 collective.purgebyid.api 调用以下方法:

  • mark_involved_objects(request, objs, stoponfirst=False)

  • mark_involved(request, single_id)

第一个方法内部使用 IInvolvedIDs 的适配器来处理给定对象,而第二个方法允许设置任意 ID。这些方法可以结合使用在您的视图中,在渲染某个特定对象或部分时。

此外,还有一个名为“purgebyid”的实用浏览器视图,可以在模板中使用如下:

<body tal:define="purgeutils nocall:context/@@purgebyid">
...
    <tal:image tal:define="image python:context.get_image()" tal:condition="python: image">

        <tal:mark-involved tal:define="dummy python:purgeutils.mark(image)" />
        <!-- put image rendering here -->
        ...

    </tal:image>
...
</body>

或者,您还可以再次设置任意 ID

<tal:mark-involved tal:define="dummy python:purgeutils.mark('my_custom_id')" />

收集所有 ID 后,ITransform 适配器将预期的 X-Ids-Involved 标头放入 HTTP 响应标头中。

当 Plone 向配置的缓存代理发送清除请求时,它还会发送一个专门的处理带标签的对象的请求。

参考文献

贡献者

Mauro Amico,作者

变更日志

1.2.2 (2024-02-29)

  • plone 6.0 / python 3.11, 3.12 支持 [mamico]

1.2.1 (2022-12-08)

  • plone 6.0 / python 3.10 支持 [mamico]

  • 避免使用 plonesite 的 UUID 标记请求 [mamico]

1.2.0 (2022-08-04)

  • collective.xkey 回滚。添加实用浏览器视图。 [pgrunewald, mamico]

  • 修复 p.a.multilingual IUUID 适配器不一致性 [mamico]

1.1.2 (2021-11-22)

  • 删除未使用的 importDependencies(用于 pip 安装兼容性)。 [cekk]

1.1.1 (2019-06-05)

  • Python 3 支持 [mamico]

1.1.0 (2018-05-14)

  • 将标头修改器从 PubSuccess 事件移动到 plone.transformchain。修复使用 p.a.caching 的 ramcache 操作中缺少的标头 #2 [mamico]

  • 添加 IIDinvolved 适配器以轻松实现“涉及 ID”提取器 [mamico]

  • 管理资源目录,因为之前所有资源都被导航根标记为“涉及” [mamico]

  • 修复 IUUID-适配器没有默认值的问题 [datakurre]

1.0.0 (2016-01-14)

  • 在请求上使用 zope.annotation [mamico]

  • 删除未使用的通用设置配置文件 [mamico]

1.0.0a1 (2013-09-11)

  • 使用templer创建的软件包 [Mauro Amico]

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分布

collective.purgebyid-1.2.2.tar.gz (25.0 kB 查看哈希值)

上传时间

构建分布

collective.purgebyid-1.2.2-py2.py3-none-any.whl (21.6 kB 查看哈希值)

上传时间 Python 2 Python 3

由以下机构支持