
一台服务器上运行 60 个容器
一个裸金属服务器运行数十到数百个 Hoody 容器。KSM 和 BTRFS 去重使边际成本接近零。
大多数监控盯着发生过的事。你需要的是一个盯着没发生的事的东西。两条 cron —— 一条跳动,一条聆听跳动的缺席 —— 还有一条在沙滩上也能找到你的呼叫。
两条 cron · 零新服务 · 什么都没发生时,告警来找你
你已有的任务继续干自己的活。完成后,它额外加一条 curl:向通知端点 POST 一行心跳。第二条 cron 按自己的节奏运行,检查沉默 —— 如果没有新心跳,它就呼叫你的手机。任务的成功是无声的。它的缺席是响亮的。
两次 POST 到 /users/root/entries,带 5 字段的表达式。第一条在每个定时任务后运行,发送它的心跳。第二条按自己的节奏运行,询问通知端点最后一次跳动是否仍然新鲜,不是就触发呼叫。无队列、无代理、无守护进程 —— 只有两行原本就必须存在的 crontab。
大多数监控工具盯着成功路径:有事发生时告警。这种形态在没有事发生时告警 —— 而那正是沉默的任务每次都会输掉的场景。
如果 worker 进程根本没启动 —— 机器重启、脚本被删、配额过期 —— 没有任何东西可以记录,也没有任何东西可以告警。观察者 cron 仍然照常运行,并发现心跳行已经过期。捕获沉默崩溃的东西,正是不依赖那个沉默对象的东西。
监控只是一行额外的 crontab,而不是一个 Healthchecks.io 账号或 CloudWatch 告警。它和工作绑定在同一个容器里,如果你需要,可以用 `expires_at` 一起过期,并从你栈里其他部分已在使用的同一个通知 API 读取。
通知端点把呼叫扇出到推送、短信和邮件 —— 那些你已经信赖的通道。你不盯面板。面板自己盯自己,只在沉默拖得过久时,在巴厘岛的沙滩上找到你。
机制就是普通的 Hoody Cron 加 Hoody Notifications。数字来自有据可查的 API 表面,而不是 demo 运行时。
标准的 5 字段表达式加宏 —— `@hourly`、`@daily`、`@weekly`、`@monthly`、`@yearly`。观察者和 worker 可以有完全不同的节奏。
受管理的条目支持 `expires_at`,所以一个临时心跳(比如一周的迁移窗口)能自己清理。观察者随工作一同消失。
每个容器都有自己的 crontab。一个租户的心跳无法静音另一个租户的观察者,禁用一个任务只是一次 PATCH `enabled: false`。
限制以 Hoody Cron API 为准:5 字段表达式加 `@hourly`/`@daily`/`@weekly`/`@monthly`/`@yearly` 宏,受管理条目可选 `expires_at`,按用户隔离的 crontab,通过 PATCH 启用/禁用。
沉默,如今是一种告警。
你想要带呼叫的 cron 监控时常会去够的工具。每一个都是单独的账号、单独的账单、单独的 API。两行 crontab 加上通知端点就能完成同样的事。
别再盯着成功路径。盯着成功的缺席 —— 沉默的失败只活在那里。