mcpField
I
incremental-fetch

incremental-fetch

github.com/shipshitdev数据与数据库38163 次安装2 天前更新
代码仓库

关于 incremental-fetch

incremental-fetch 是用于构建可恢复数据摄取流水线的技能。它以两个水位分别处理新增数据和历史回填,并逐页保存记录、在成功后提交进度。

主要功能

  1. 01分别设置正向与回填水位
  2. 02每页抓取后保存记录
  3. 03成功运行后提交水位
  4. 04按分页类型调整模式
  5. 05采用指数退避与抖动重试

适用场景

  1. 01构建可恢复的 API 数据摄取流水线
  2. 02回填旧记录且不影响增量更新
  3. 03中断后保留已保存的页面数据

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/shipshitdev/skills --skill incremental-fetch

安装后在 Claude Code 中输入/incremental-fetch确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

plugin.json
README.md
references/
patterns.md

详细介绍

增量获取

构建永不丢失进度、也不会重新获取已有数据的数据管道。

双水位线模式

跟踪两个游标,以同时支持向前和向后获取:

水位线用途API 参数
newest_id获取自上次运行以来的新数据since_id
oldest_id回填较早的数据until_id

单个水位线只能向前获取。两个水位线则可以:

  • 常规运行:获取新数据(自 newest_id 起)
  • 回填运行:获取较早的数据(截至 oldest_id)
  • 不重叠,不遗漏

关键:数据与水位线的保存

这是两个不同的操作,保存时机也不同:

内容保存时机原因
数据记录每获取一页后提高韧性:如果在第 47 页中断?保留前 46 页
水位线每次运行结束时保存一次保证正确性:只有完整成功后才提交进度
fetch page 1 → save records → fetch page 2 → save records → ... → update watermarks

工作流决策树

First run (no watermarks)?
├── YES → Full fetch (no since_id, no until_id)
└── NO → Backfill flag set?
    ├── YES → Backfill mode (until_id = oldest_id)
    └── NO → Update mode (since_id = newest_id)

实现检查清单

  1. 数据库:创建 ingestion_state 表(参见 patterns.md)
  2. 获取循环:每获取一页 API 数据后立即插入记录
  3. 水位线跟踪:跟踪本次运行中看到的最新和最旧 ID
  4. 水位线更新:仅在运行成功结束时保存一次水位线
  5. 重试:使用带抖动的指数退避
  6. 速率限制:等待限制重置,或跳过并记录以供下次运行处理

分页类型

此模式最适合基于 ID 的分页(可比较的数字 ID)。对于其他分页类型:

类型调整方式
游标/令牌存储游标字符串,而不是 ID;无法进行数值比较
时间戳使用 last_timestamp 列;按日期比较
偏移量/限制存储页码;从上次保存的页面继续

有关模式和代码示例,请参阅 references/patterns.md。

注意事项

  • 仅在完全成功后保存水位线。 如果进程在运行中途崩溃,由于水位线未保存,下次运行会重新获取数据并从头去重——不会丢失数据,但可能会比较慢。在运行中途保存水位线会造成永久性遗漏。
  • 最新 ID 不一定是数值最大的 ID。 某些 API 返回的 ID 不会单调递增(例如受时钟漂移影响的雪花 ID)。始终根据 API 自身的排序保证进行比较,而不要进行数值比较。
  • 回填模式不得覆盖 newest_id。 回填运行会向前扩展历史记录;它只应更新 oldest_id。回填期间覆盖 newest_id 会导致下一次向前更新时重复获取数据。
  • 不同 API 的速率限制标头各不相同。 Twitter 使用 x-rate-limit-reset;其他 API 则使用 Retry-After。实现等待逻辑前,请检查相应 API 的响应标头。

评论

支持 Markdown