跳转到内容
use-cases / three-cadences-one-container / hero
CRON · 一份 CRONTAB · 一个容器

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

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

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

一次 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 读取你写的文件并运行它。

use-cases / three-cadences-one-container / cadences

三种节奏,三个脚本

每种节奏背后都是一行 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
use-cases / three-cadences-one-container / powers

三行解锁了什么

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

存储

三个脚本共享同一块磁盘

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

运维

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

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

经济

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

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

use-cases / three-cadences-one-container / operations

你实际怎么用它

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)。

use-cases / three-cadences-one-container / economics

你不用付的钱

三个数字,来自实际的机制。数字来自 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 字段表达式同时支持。

use-cases / three-cadences-one-container / punchline

三种节奏,三行 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 文档
use-cases / three-cadences-one-container / replaces

它替代了什么

三个 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 规则
use-cases / three-cadences-one-container / cta

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

阅读 cron 文档
use-cases / three-cadences-one-container / related

阅读其他内容