コンテンツにスキップ
use-cases / daily-rollups-no-orchestrator / hero
日次ロールアップ · オーケストレーターなし

オーケストレーターなしの日次ロールアップ

毎晩 1 時、cron エントリが exec URL を curl します。スクリプトはあなたの sqlite URL 上でロールアップ SQL を実行し、日次テーブルを書き戻します。Airflow Postgres なし、DAG ファイルなし、14 のウィジェットを持つスケジューラ ダッシュボードなし、オーケストレーター自体のオンコールなし。

ドキュメントを読む
use-cases / daily-rollups-no-orchestrator / mechanism

2 つの URL と 5 フィールドのスケジュール

パイプライン全体は 1 つの exec URL を指す 1 つの cron エントリです。cron エントリは /users/root/entries への POST。exec URL は sqlite URL を開き、ロールアップ SQL を実行し、新しい行を返す小さなスクリプトです。それが DAG 全体です。

POST /users/root/entries
スケジュール
// every night at 01:00 UTC
POST /users/root/entries
{
  "schedule": "0 1 * * *",
  "command":  "curl -fsS https://exec.containers.hoody.com/scripts/rollup/run"
}
1 時 · CURL
exec.containers.hoody.com/scripts/rollup/run
パイプライン
// the entire pipeline body
import { Database } from "bun:sqlite";

const db = new Database("events.db");
db.run(`INSERT INTO rollup_daily
         SELECT date_trunc('day', created_at), count(*)
         FROM   events GROUP BY 1;`);

return { ok: true, rows: db.query("SELECT * FROM rollup_daily").all() };

ロールアップが失敗した場合、cron ログがそう報告します。昨日をバックフィルする必要があれば、date パラメータ付きで exec URL を手動で curl します。学ぶ 2 つ目のシステム、生かし続けるスケジューラ DB、コミットする DAG ファイルはありません。オーケストレーターは URL を指す cron エントリです。

use-cases / daily-rollups-no-orchestrator / powers

構築しなくてよかったもの

Hoody Kit はスケジューラ、ランタイム、ストレージをプレーンな HTTP サービスとして出荷します。パイプラインはそれらの間の curl コール — それだけです。

オーケストレーター デーモンなし

スケジューラは HTTP エントリ

hoody-cron はスケジュールを /users/root/entries のリソースとして保存します。バックアップする Postgres メタデータ DB なし、健全に保つスケジューラ コンテナなし、デプロイする DAG リポジトリなし。1 行を POST すれば実行が発火します。

ランタイム配線なし

スクリプトは URL

hoody-exec は exec.containers.hoody.com/scripts/rollup/run で要求に応じてロールアップ スクリプトを実行します。cron が curl し、200 を受け取り、レスポンスをログ。ワーカー キュー、ブローカー、pickle 化されたタスク グラフなし。

ログ パイプラインなし

実行履歴はレスポンス ボディ

各 exec コールは新しい行を JSON として返し、cron がステータス、タイムスタンプ、stdout でログします。バックフィル、失敗、再実行はすべて同じ 2 つの URL に存在 — ログ集約システムへ送る追加要素はありません。

use-cases / daily-rollups-no-orchestrator / backfill

実行が失敗した場合 — またはバックフィルが必要な場合

パイプラインは 2 つの URL と date パラメータです。昨日の再実行は夜間実行と同じ形で、exec URL に ?date=2026-04-30 を付けるだけ。リプレイ UI なし、スケジューラの癖なし。

  1. 01 · 検出

    cron ログが失敗を示す

    1 時の実行が non-2xx を返したら、hoody-cron 上のエントリの最新実行レコードに終了コードとキャプチャされたレスポンスボディが表示されます。配線する別個のアラート サービスは不要 — エントリを GET して読むだけ。

  2. 02 · バックフィル

    ?date= 付きで exec URL を curl

    スクリプトは date パラメータを受け付けます。昨日の日付を渡すと、その日のロールアップ行を再計算し、INSERT OR REPLACE で壊れた行を置き換えます。1 つのコマンド、DAG 再トリガー UI なし。

  3. 03 · 検証

    レスポンスは新しい行

    exec は新しく書き込まれたロールアップ行を JSON として返します。期待した結果と diff を取り、次に進みます。他に確認することはありません — ダッシュボード URL は今書いたのと同じテーブルを提供します。

// rerun yesterday's rollup by handcurl -fsS https://exec.containers.hoody.com/scripts/rollup/run?date=2026-04-30
use-cases / daily-rollups-no-orchestrator / capacity

パイプラインの形

3 つの数字でシステム全体を記述します。あなたのリポジトリにある今日の Airflow デプロイメントと比較してください。

  1. フィールド · CRON スケジュール5

    分、時、日、月、曜日。実行が発火するタイミングの設定面はそれだけです。

  2. URL · エントリ + EXEC2

    スケジュール登録の 1 つの POST、スクリプトを実行する 1 つの GET。それがデプロイ可能なパイプライン全体です。

  3. デーモン · オーケストレーターなし0

    生かし続けるスケジューラ プロセスなし、メタデータ データベースなし、ワーカー プールなし。Hoody Kit がスケジュールを保持しスクリプトを実行します。

数字は Hoody Kit 上の cron + exec モデルを表します。既存のパイプラインにはおそらく可動部品がもっと多いでしょう、それが比較の要点です。

use-cases / daily-rollups-no-orchestrator / punchline

オーケストレーターは URL を指す cron エントリです。

ビフォー · スケジューラ スタックアフター · 1 行の cron
ビフォーairflow webserver + scheduler + worker + postgres + dags/rollup_daily.py5 つのプロセス、メタデータ DB、DAG ファイルのリポジトリ
現在0 1 * * * curl -fsS https://exec.containers.hoody.com/scripts/rollup/run1 行。1 つの URL。1 つのスケジュール。
ドキュメントを読む
use-cases / daily-rollups-no-orchestrator / replaces

これが置き換えるもの

オーケストレーション層は 1 行の cron に折りたたまれます。DAG はあなたのスクリプトの中に住みます。

  • Apache Airflow1 つのクエリのための Postgres + Redis + scheduler + worker
  • Prefectクラウドアカウント、エージェント インストール、フロー登録
  • DagsterPythonic、しかし依然として運用するサービス
  • Luigi夜間 SQL をスケジュールするためのグラフエンジン
  • GitHub Actions スケジュールmain にピン留め、テナント別コンテキストなし
  • dbt CloudSELECT をラップする CLI をラップする SaaS
  • カスタム Python スケジューラwhile ループと try/except、「堅牢」と呼ばれる
use-cases / daily-rollups-no-orchestrator / cta

オーケストレーターを稼働させるのをやめましょう。cron エントリを稼働させましょう。

ドキュメントを読む
use-cases / daily-rollups-no-orchestrator / related

他のユースケースを読む