三个已注册 Web 端点分为仅 passing 的 web-1 集合,以及包含 warning 的 web-1 与 web-2 集合。

Consul 发现结果取决于健康策略与新鲜度

Consul 服务发现提供注册端点和已经记录的健康观测,不能承诺每个返回端点都会成功响应调用方的下一次请求。实用的运维模型需要分开四件事:注册了什么、哪些检查与该实例有关、查询接受哪些状态,以及这些观测可能已经过去多久。仅仅成功解析到一个地址,并没有自动建立上述全部保证,也没有证明业务请求已经能够完成。 注册记录与健康状态是两回事 catalog 存储注册信息,健康端点再附上检查结果。不加过滤的 /v1/health/service/web 响应,可以包含检查为 critical 的实例。检查失败并不会自动抹去服务注册;显式注销、配置了持续 critical 后自动移除,属于不同的生命周期机制。ACL 也可能影响读者能看到哪些记录,所以查询里缺少实例,不能只归因于健康检查失败。 注册的检查通常从 critical 开始,除非显式提供初始状态。但这并不意味着每个注册服务都一定具有有意义的就绪检查。判断某个服务实例时,需要结合它自己的服务级检查,以及 serfHealth 等节点级检查。同一节点上,数据库服务的检查失败,不会自动让不相关的 Web 服务检查失败;节点级检查变为 critical,则会影响该节点上的服务。不要把“相关检查全部通过”误解成“这台机器上的所有服务检查都必须通过”。 检查结果也不只是布尔值。脚本退出码零表示 passing,一表示 warning,其他退出码表示 critical;HTTP 检查按重定向处理后的响应判断:2xx 为 passing,429 为 warning,其他最终响应表示失败。默认会跟随重定向,除非设置 disable_redirects。这些状态究竟证明了什么,仍取决于探测内容。TCP 握手成功或进程存在,并不证明应用能完成一次真实请求;检查实现必须与希望验证的能力对应。 DNS 并非总是只返回 passing HTTP 健康端点的 passing=true 要求相关检查全部 passing。Consul DNS 服务查询的默认策略不同:warning 实例仍可符合候选条件,critical 实例则被排除。配置 dns_config.only_passing=true 后,warning 也会被排除。因此,一个 warning 实例出现在 DNS,却不在 passing-only API 结果里,不一定意味着检查失效,也可能只是两条路径明确采用了不同策略。 ...

四月 6, 2028 · 2 分钟 · XB Field Notes
包含三个公开路径与一个打叉草稿的清单,生成三个条目的 urlset 及三个公开目标;发现不保证收录。

Sitemap 帮助爬虫发现页面

Sitemap 为爬虫提供一份明确的候选网址清单,适合帮助发现新内容或普通导航中较深的文档。这份列表不会绕过登录、授予抓取权限、保证搜索收录,也不能承诺某天一定重新访问。应把它视为计划公开文档的发布清单,并让清单与规范网址及实际发布状态保持一致。文件成功上传,只能说明某一步交付发生了,不能替代后续抓取和收录证据。 从发布清单生成 使用与公开页面相同的权威内容筛选规则,排除草稿、私有文档和多余的跟踪参数变体。源码目录里存在一个文件,不代表它已经对应公开 URL;反过来,分页、翻译文档或生成路由,也未必与源文件逐一对应。因此需要查看生成器实际输出,而不是仅凭目录列表猜测发布范围。内容筛选与 sitemap 生成相互独立维护,容易出现遗漏或提前暴露未发布入口。 XML sitemap 使用声明的命名空间,以及包含网址条目的 urlset,每个 loc 提供完整网址。XML 转义与 URL 编码解决不同问题:分隔查询参数的与号,需要在 XML 文本里转义,而网址本身的字符也必须符合相应 URI 表示方式。生成后应重新解析文件,确认经过两层处理,仍然得到原本希望发布的网址,不能因为 XML 看起来能打开就省略这一检查。 还要遵守格式的范围与大小条件。通常应列出相应主机及允许位置范围内的网址,受支持的跨站提交安排有额外规则。每份 sitemap 最多五万个网址,未压缩内容不得超过 52,428,800 字节。gzip 可以减少传输量,却不能取消解压后的上限。更大的清单应拆分并使用适当索引,不能为了让文件通过检查而悄悄截断后面的页面。 这份清单本身也是公开数据。私有文档没有出现在导航里,并不意味着它的网址可以放心写入公开 sitemap。发布前应检查生成 XML 是否暴露了不该公开的入口,同时在资源处独立执行访问控制。爬虫发现偏好与权限控制是不同机制,清单筛选不能替代真正的授权检查。 坏掉的样子 XML 合法的文件,仍可能列出跳转、缺失页面或不应进入索引的内容。应同时验证目标与语法,并让目标上的 canonical 声明符合预期清单。某个地址返回二百,却只有登录界面或通用错误页,不能证明列出的文档真正可用。Sitemap 自身成功交付,与其描述的页面是否有用,需要分别检查,不能在一个状态码上完成所有判断。 修改时间也可能失真。提供 lastmod 时,应依据页面有意义的变化,而不是每次构建都刷新所有条目的时间。Google 明确说明,它会使用持续准确的 lastmod,并忽略 priority 和 changefreq。这些字段不是调度接口,把所有页面都标成最高优先级,也不能命令爬虫增加访问。没有可信历史依据时,省略可选字段比编造精确时间更诚实。 ...

六月 30, 2027 · 2 分钟 · XB Field Notes
两列独立对比:爬虫决定不抓取 /private/,而直接 GET /private/report 仍收到 200 和公开演示数据。

robots.txt 引导抓取,但不授予或禁止访问

robots.txt 向实现 Robots Exclusion Protocol 的自动客户端传达抓取规则,可以减少对昂贵或无用路径的遍历,但服务器不会因此自动按照文件内容拦截请求。RFC 9309 明确区分这些规则与访问授权。应把它当作面向合作爬虫的公开接口,真正能否读取受保护资源,仍由认证和授权机制决定。配置中写了禁止抓取,不等于服务器已经建立了权限边界。 对准目标爬虫与实际路径 标准文件位于相应方案和 authority 的 /robots.txt,放在应用子目录下的同名文件,不会自动成为整个源站的策略。User-agent 分组标识规则面向的爬虫产品,通配分组按协议为其他代理提供适用规则。路径规则针对请求目标匹配,大小写不同可能产生不同结果。路由变化时应重新检查具体 URL,不能只看规则文字仍然像原来的样子。 文件应以 UTF-8 纯文本形式提供,并明确实际响应。宽泛的静态站回退规则,可能在 robots 路径返回二百和首页内容;这只证明 HTTP 已经交付,不能证明爬虫取得了预期策略。复杂的 Allow、Disallow 组合、转义和通配模式,需要对照协议及真实爬虫实现验证。一个简单解析器案例不能替整个规则集合证明所有边界行为正确。 坏掉的样子 在 robots.txt 中列出私有路径,并不会隐藏路径;公开的规则文件反而可能告诉别人它在哪里。客户端可以完全不读策略就直接请求,合作爬虫自己作出的不抓取决定,也不会转化为源站上的访问规则。确实需要限制的内容,应在请求授权的位置执行限制;Disallow 行不能替代账号权限或其他实际访问检查。公开规则和私有资源的保护条件必须分开维护。 抓取与收录也是不同问题。Google 文档说明,被禁止抓取的 URL 仍可能因为其他来源的链接出现在搜索结果里。如果爬虫无法读取页面,也可能看不到页面上希望它执行的 noindex 指令。公开内容需要按目标选择合适的收录控制,私有内容则要使用真实访问限制。不能认为阻止内容下载,就会自动移除所有已存在的搜索记录或外部引用。 策略获取失败同样有不同语义。RFC 9309 允许爬虫在文件不可用时访问资源,例如收到四开头的 HTTP 响应;如果服务器或网络错误导致文件无法到达,例如五开头的响应,爬虫起初必须假定完全禁止。规范还定义了长期失败与缓存副本的处理。部署坏了 robots 文件,可能改变抓取行为,不应只把它当成少了一份装饰性文本。 ...

十月 2, 2026 · 2 分钟 · XB Field Notes