自动停止
Benjamin 支持在满足指定条件的情况下自动停止。
目前 Benjamin 支持配置如下的自动停止条件:
- 时间限制:在爬取多久后停止
- Target 数量限制:在爬取多少个 Target 后停止
- Result 数量限制:在爬取多少个 Result 后停止
以上限制可以从 TaskConfig 的顶级参数中配置。默认情况下,所有以上配置均为不限制。
停止的策略
所有自动停止均为软停止(Soft Stop)。在触发停止条件时只会停止爬取新的目标,而所有已经在爬取中的目标不受影响,会继续爬取完成。这意味着,无论是时间限制还是数量限制都只是一个软约束,最终的爬取结果可能会超过这些限制值。
停止中的状态
考虑到多种因素,在触发自动停止后并不会将任务的状态设置为 Stopping,而是继续保持 Running 状态。如需判断任务是否处于停止中,可以通过 Task 中是否存在 namespace 为 STOP_EARLY_REASON 的 Note 来判断。
对应 Note 的 fields 内容中的 r 字段始终存在、代表了停止原因,不同原因可能会额外追加一些特有的字段,具体可参考下面的文档。
停止时机
时间限制
时间限制用于限制在爬取开始后多久会停止爬取。时间限制可以通过 TaskConfig 的 max_time_seconds 字段来配置,单位为秒,默认不限制。
当因时间限制而停止时,STOP_EARLY_REASON Note fields 的 r 为 ExceedRunningTime:
{
"time":"2023-11-17T05:09:48.816960716Z",
"namespace":"STOP_EARLY_REASON",
"message":"running time 70s exceeds limit 60s",
"fields": {
"r": "ExceedRunningTime",
"mostSeconds": "60", // 限制的最长运行时间
"usedSeconds": "70", // 首次触发限制时的实际运行时间
}
}
Target 数量限制
Target 数量限制用于限制在爬取多少个 Target 后停止爬取(包含所有爬取完成的和所有爬取中的)。Target 数量限制可以通过 TaskConfig 的 max_target 字段来配置,默认不限制。
当因 Target 数量限制而停止时,STOP_EARLY_REASON Note fields 的 r 为 ExceedTargetsCountLimit:
{
"time": "2023-11-17T05:08:32.215641728Z",
"namespace": "STOP_EARLY_REASON",
"message": "targets count 2 exceeds limit 1",
"fields": {
"r": "ExceedTargetsCountLimit",
"limitTargets": "1", // 限制的最大 Target 数量
"currentStartedTargets": "2", // 首次触发限制时的实际已经开始运行的 Target 数量
}
}
Result 数量限制
Result 数量限制用于限制在爬取得到多少个 Result 后停止爬取。Result 数量限制可以通过 TaskConfig 的 max_result 字段来配置,默认不限制。
当因 Result 数量限制而停止时,STOP_EARLY_REASON Note fields 的 r 为 ExceedResultsCountLimit:
{
"time": "2023-11-17T05:08:11.563342298Z",
"namespace": "STOP_EARLY_REASON",
"message": "results count 71 exceeds limit 1",
"fields": {
"r": "ExceedResultsCountLimit",
"limitResults": "1", // 限制的最大 Result 数量
"currentResults": "71", // 首次触发限制时的实际 Result 数量
}
}
备注:
- 因所有 Target 也会生成一个对应的 Result,因此实际上 Result 数量限制也包含了 Target 数量限制。
- 考虑到 Result 可能重复,因此 Result 的限制计算时会利用 CanonicalURL 字段排除重复的进行计数。但因为 NewResult 事件并不会去重,因此下游可能观测到发送的 NewResult 数量远大于这里限制的数量。