跳转到内容
类型解锁
阶段生产环境
难度中等
工作自动化任务
用于个人创始人
用于后端开发者
服务Cron
服务浏览器
服务SQLite
服务文件
为何选 HoodyHTTP 原生
为何选 Hoody容器经济学
类型解锁
阶段生产环境
难度中等
工作自动化任务
用于个人创始人
用于后端开发者
服务Cron
服务浏览器
服务SQLite
服务文件
为何选 HoodyHTTP 原生
为何选 Hoody容器经济学
类型解锁
阶段生产环境
难度中等
工作自动化任务
用于个人创始人
用于后端开发者
服务Cron
服务浏览器
服务SQLite
服务文件
为何选 HoodyHTTP 原生
为何选 Hoody容器经济学
类型解锁
阶段生产环境
难度中等
工作自动化任务
用于个人创始人
用于后端开发者
服务Cron
服务浏览器
服务SQLite
服务文件
为何选 HoodyHTTP 原生
为何选 Hoody容器经济学
CRON · 一份 CRONTAB · 一个容器

三种节奏,一个容器,在固定费率服务器上

每小时浏览器抓取、每日 SQLite 摘要、每周文件归档。三种节奏整齐地嵌在一份 crontab 里——它们不过是三行 `* * * * *` 指向三个脚本。没有调度服务、没有任务队列、没有 worker 池。

阅读 cron 文档
账单
本月
固定费率服务器 / 月
  • 运行在一个服务器里
  • 三种节奏
  • 零调度服务
容器 CPU · 24 小时
−24h → 现在
空闲基线~4%
只在 3 个触发时间点出现尖峰——之间一直是平的

一次 PUT 写入整份调度

Hoody Cron 服务把原始 crontab 暴露为一个 REST 资源。PUT 一次文件,内核就一直运行下去。三行、三个脚本——每个都是一行已经会讲 HTTP 的命令。

请求 · /users/root/crontab
PUT · 原始 crontab
# 一次调用替换整份 crontab。
PUT /users/root/crontab
Content-Type: text/plain

@hourly  bash /scripts/scrape.sh
0 9 * * * bash /scripts/digest.sh
0 0 * * 0 bash /scripts/archive.sh

HTTP/1.1 204 No Content
剩下的交给内核
脚本 · /scripts/*.sh
exec · 三段执行体
# scrape.sh — 每小时把截图写进 sqlite
curl -sS https://browser.containers.hoody.com/screenshot \
  --data-urlencode "url=https://store.hoody.com/p/123" | sqlite3 /data/prices.db \
  "INSERT INTO rows VALUES (?, ?, ?)"

# digest.sh — 9 点计算差额并把摘要 pipe 出去
sqlite3 /data/prices.db < /scripts/digest.sql \
  > /tmp/digest.txt && curl -T /tmp/digest.txt \
  https://pipe.hoody.com/api/v1/pipe/digest

# archive.sh — 周日午夜 dump 并存档
sqlite3 /data/prices.db ".dump" | curl -T - \
  https://files.containers.hoody.com/archives/$(date +%Y-w%V).sql

三个脚本。三个它们已经会调用的 URL。一次 PUT 装好调度。这后面没有任何调度服务——内核里的 crond 读取你写的文件并运行它。

三种节奏,三个脚本

每种节奏背后都是一行 5 字段表达式 + 一行 shell。三者互不需要知道对方——它们只共享一块磁盘和一个时钟。

每小时 · 抓取

把竞品页面拉进 SQLite

hoody-browser 给一组商品 URL 截图。每一行直接写进容器卷上的一个 SQLite 表。没有抓取 worker 池——这一行 cron 就是 worker 池。

@hourly bash /scripts/scrape.sh
每日 · 摘要

计算差额,推送摘要

9 点摘要脚本读取过去 24 小时的行,计算价格差额,再把摘要 curl 到一个 pipe URL。你的收件箱 / 仪表盘从同一个 pipe 读取。

0 9 * * * bash /scripts/digest.sh
每周 · 归档

把一周数据 dump 到 files URL

周日午夜归档脚本对 SQLite 执行 `.dump`,按 ISO 周命名文件,PUT 到 hoody-files。旧行被清理。卷永远小巧。

0 0 * * 0 bash /scripts/archive.sh

三行解锁了什么

三种节奏跑在一个容器里不是 hack——这就是 cron 本来的样子。平台已经给了你一个调度器;你只是不再为同一个东西付三次钱了。

存储

三个脚本共享同一块磁盘

每小时的抓取写入每日摘要要读的行。每日摘要写入每周归档要 dump 的差额。它们之间没有 IPC——只是同一个卷上的三个进程。

运维

重启一个容器,而不是三个

重新部署只重新部署一个镜像。看日志只 tail 一个日志文件。磁盘满了只满一次。任何节奏的影响半径和其他两个一样。

经济

一张固定费率服务器,没有调度器分层

Lambda/EventBridge 按每次调用计费;ECS Scheduled Tasks 按常驻集群计费。在 Hoody 上,这运行在你已经付费的固定费率服务器里。三种节奏的成本不比一种贵。

你实际怎么用它

crontab 是一个文件。文件有一个 URL。你能对文件做的事,都能在 HTTP 上做。

  1. 加第四种

    POST /users/root/entries

    创建一条带 UUID 和可选注释的托管条目。API 会替你把这行注入 crontab,并给你一个句柄之后启用、禁用或删除。

  2. 禁用而不删除

    PATCH enabled: false

    事故期间暂停某种节奏,又不丢失它的定义。事故关闭后再开回来。这一行留在文件里,标注为 managed-disabled。

  3. 读取文件

    GET /users/root/crontab

    随时拿回原始 crontab,包括所有托管条目。和你的仓库做 diff。pipe 进版本控制。Cron 是一个文件,现在这个文件是一个 URL。

端点来自 Hoody Cron API:托管条目 CRUD,再加上按用户的完整原始 crontab 读写。支持标准 5 字段表达式与宏(@hourly、@daily、@weekly)。

你不用付的钱

三个数字,来自实际的机制。数字来自 Hoody Cron API 的保证和固定费率服务器模型——不是凭空的基准。

  1. 服务器

    三种节奏全部运行在同一个固定费率服务器里。入场服务器起价 $29/月;额外 cron 行无额外费用。

  2. CRON 行

    一个 @hourly、一个 9 点的、一个周日的。/users/root/crontab 里三行。整套编排塞进一次 PUT。

  3. 额外服务0

    没有 Lambda、没有 EventBridge、没有 Sidekiq、没有 Airflow 调度器、没有 ECS scheduled task 定义。Cron 的 HTTP API 就是调度器。

依据 Hoody Cron API:托管条目通过 JSON CRUD、原始 crontab 读写、通过 expires_at 自动过期、按用户的 crontab 隔离。宏 @hourly / @daily / @weekly 与 5 字段表达式同时支持。

三种节奏,三行 cron,一个容器,在起价 $29/月的固定费率服务器上。

每小时@hourly bash /scripts/scrape.sh竞品价格 → sqlite
每日0 9 * * * bash /scripts/digest.sh9 点 — 汇总差额
每周0 0 * * 0 bash /scripts/archive.sh周日 — 输出 parquet 到 files
之前 · 三个 lambda、三份账单之后 · 一张固定费率服务器,许多 cron 行
阅读 cron 文档

它替代了什么

三个 Lambda、三个 GitHub Actions、三个 ECS scheduled tasks——做三种节奏时常规会搬出来的栈。它们每个都按节奏或调用向你收费;Hoody 按服务器收费。

  • 三个 AWS Lambda 函数对就是三段写在磁盘上的 shell 脚本,按调用次数收费
  • 三个 GitHub Actions 调度为一次 5 秒的 SQLite 查询,整套 CI runner 都得拉起来
  • 三个 Sidekiq worker为只共享磁盘、不共享其他状态的任务,搬出 Redis 支撑的 worker 池
  • 三个 serverless 函数 / 三份账单同一段逻辑做三次部署、三份日志、三个计费表
  • 多服务编排(Airflow、Step Functions)为三个节点之间零边的图,请来一个 DAG 引擎
  • 三个 ECS scheduled tasks三份 task definition、三个 IAM 角色、三条 CloudWatch 规则

别再租调度器。把调度写进一个文件。容器已经在跑 cron——三行之后,整条 pipeline 就发布了。

阅读 cron 文档

阅读其他内容