コンテンツにスキップ
use-cases / three-cadences-one-container / hero
CRON · 1 CRONTAB · 1 コンテナ

3 つのカデンス、定額制のサーバー上の 1 つのコンテナ

毎時のブラウザスクレイプ、日次の SQLite ダイジェスト、週次のファイルアーカイブ。3 つのリズムは 1 つの crontab にきれいに収まります — 3 つのスクリプトを指す 3 行の `* * * * *` にすぎません。スケジューラサービスもジョブキューもワーカープールもありません。

cron ドキュメントを読む
請求
今月
定額制サーバー / 月
  • 1 つのサーバー内で実行
  • 3 つのカデンス
  • ゼロのスケジューラサービス
コンテナ CPU · 24 時間
−24h → 現在
アイドルのベースライン~4%
3 つのトリガー時刻にだけスパイク — その間はフラット
use-cases / three-cadences-one-container / mechanism

1 つの PUT がスケジュール全体を書き込む

Hoody Cron サービスは raw crontab を REST リソースとして公開します。一度ファイルを PUT すれば、カーネルが永遠に実行します。3 行、3 スクリプト — それぞれがすでに HTTP を話す 1 行スクリプトです。

リクエスト · /users/root/crontab
PUT · raw crontab
# 1 回の呼び出しで 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 · 3 つの本体
# 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 時、差分を計算してダイジェストをパイプ
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 — 日曜の真夜中、ダンプして保存
sqlite3 /data/prices.db ".dump" | curl -T - \
  https://files.containers.hoody.com/archives/$(date +%Y-w%V).sql

3 つのスクリプト。それらがすでに呼び出し方を知っている 3 つの URL。スケジュールをインストールするための 1 回の PUT リクエスト。この前にスケジューラサービスはありません — カーネルの crond があなたが書いたファイルを読んで実行します。

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

3 つのリズム、3 つのスクリプト

各カデンスには、1 つの 5 フィールド表現と 1 つのシェル行があるだけです。どれも他の 2 つを知る必要がありません — ディスクとクロックを共有しているだけです。

毎時 · スクレイプ

競合ページを SQLite に取り込む

hoody-browser が製品 URL のリストをスクリーンショットします。各行はコンテナのボリューム上の SQLite テーブルに直接入ります。スクレイプワーカープールはありません — cron 行がワーカープールです。

@hourly bash /scripts/scrape.sh
日次 · ダイジェスト

差分を計算し、ダイジェストをプッシュ

9 時にダイジェストスクリプトが直近 24 時間の行を読み、価格差分を計算し、ダイジェストをパイプ URL に curl します。受信トレイ / ダッシュボードは同じパイプから読みます。

0 9 * * * bash /scripts/digest.sh
週次 · アーカイブ

1 週間分をファイル URL にダンプ

日曜の真夜中にアーカイブスクリプトが SQLite を `.dump` し、ISO 週でファイル名を付けて hoody-files に PUT します。古い行は削除されます。ボリュームは永久に小さく保たれます。

0 0 * * 0 bash /scripts/archive.sh
use-cases / three-cadences-one-container / powers

3 行で得られるもの

1 つのコンテナの中の 3 つのカデンスはハックではありません — それは cron の自然な形です。プラットフォームはすでにスケジューラを提供しています。3 倍のお金を払うのをやめただけです。

ストレージ

3 つのスクリプトすべてが 1 つのディスクを共有

毎時のスクレイプは、日次のダイジェストが読む行を書きます。日次のダイジェストは、週次のアーカイブがダンプする差分を書きます。それらの間に IPC はありません — 同じボリューム上の 3 つのプロセスです。

オペレーション

再起動するコンテナは 3 つではなく 1 つ

再デプロイするときは 1 つのイメージを再デプロイします。ログを確認するときは 1 つのログファイルを tail します。ディスクが満杯になるときは 1 度満杯になります。どのカデンスの影響範囲も他と同じです。

経済性

1 つの定額制のサーバー、スケジューラティアなし

Lambda/EventBridge は呼び出しごとに課金します。ECS Scheduled Tasks は常時稼働クラスタに課金します。Hoody では、定額制のサーバー内で動作します。3 つのカデンスは 1 つと同じコスト。

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

実際の使い方

crontab はファイルです。ファイルには URL があります。ファイルに対してできることは何でも、HTTP 経由でできます。

  1. 4 つ目を追加

    POST /users/root/entries

    UUID とオプションのコメントを持つマネージドエントリを作成します。API が crontab に行を挿入し、後で有効化、無効化、削除するためのハンドルを返します。

  2. 削除せずに無効化

    PATCH enabled: false

    インシデント中にカデンスを一時停止し、定義を失わないようにします。インシデントがクローズしたらまたオンに戻します。行はファイルに残り、managed-disabled としてコメントされます。

  3. ファイルを読む

    GET /users/root/crontab

    すべてのマネージドエントリを含む raw crontab をいつでも取得します。リポジトリと差分を取ります。バージョン管理にパイプします。cron はファイルであり、今やそのファイルは URL です。

Hoody Cron API のエンドポイント: マネージドエントリ CRUD に加えて、ユーザーごとの完全な raw-crontab 読み書き。標準の 5 フィールド表現とマクロ (@hourly、@daily、@weekly)。

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

支払っていないもの

実際のメカニックから得た 3 つの数字。数値は Hoody Cron API の保証と定額制のサーバーモデルによるもので、捏造したベンチマークではありません。

  1. サーバー

    3 つのカデンスすべてが定額制のサーバー内で動きます。月額 $29 からの入門サーバー。追加の cron 行は追加料金なし。

  2. CRON 行

    1 つの @hourly、1 つの 9 時の日次、1 つの日曜の週次。/users/root/crontab に 3 行。オーケストレーター全体が 1 つの PUT リクエストに収まります。

  3. 追加サービス0

    Lambda なし、EventBridge なし、Sidekiq なし、Airflow スケジューラなし、ECS スケジュールタスク定義なし。cron の HTTP API がスケジューラです。

Hoody Cron API より: JSON CRUD によるマネージドエントリ、raw-crontab の読み書き、expires_at による自動失効、ユーザーごとの crontab 分離。マクロ @hourly / @daily / @weekly は 5 フィールド表現と並んで受け入れられます。

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

3 つのカデンス、3 つの cron 行、定額制のサーバー月額 $29/月から。

毎時@hourly bash /scripts/scrape.sh競合価格 → sqlite
日次0 9 * * * bash /scripts/digest.sh9 時 — 差分をロールアップ
週次0 0 * * 0 bash /scripts/archive.sh日曜 — parquet をファイルへ
before · 3 つの lambda、3 つの請求after · 1 つの定額制のサーバー、多くの cron 行
cron ドキュメントを読む
use-cases / three-cadences-one-container / replaces

これが置き換えるもの

3 つの Lambda、3 つの GitHub Actions、3 つの ECS スケジュールタスク — 3 つのカデンスのために手が伸びる標準的なスタック。それぞれが呼び出しごとまたは呼び出しごとに課金します。Hoody はサーバーの料金を請求します。

  • 3 つの AWS Lambda 関数ディスク上の 3 つのシェルスクリプトにすぎないものに、呼び出しごとの課金
  • 3 つの GitHub Actions スケジュール5 秒の SQLite クエリのために起動される CI ランナー全体
  • 3 つの Sidekiq ワーカーディスク以外の状態を共有しないジョブのための Redis ベースのワーカープール
  • 3 つのサーバーレス関数 / 3 つの請求同じロジックのための 3 つのデプロイ、3 つのログ、3 つの料金メーター
  • マルチサービスオーケストレーション (Airflow、Step Functions)3 つのノード間にエッジが 1 つもないグラフのための DAG エンジン
  • 3 つの ECS スケジュールタスク3 つのタスク定義、3 つの IAM ロール、3 つの CloudWatch ルール
use-cases / three-cadences-one-container / cta

スケジューラを借りるのをやめましょう。スケジュールをファイルに書き込んでください。コンテナはすでに cron を実行しています — 3 行後にはパイプライン全体が出荷できます。

cron ドキュメントを読む
use-cases / three-cadences-one-container / related

他のユースケースを読む