
1 つのサーバーで 60 のコンテナ
1 つのベアメタルボックスで数十から数百の Hoody コンテナを実行。KSM と BTRFS のデデュプでマージナルコストはほぼゼロ。
8 時間のマイグレーションを実行中です。5 人がレシーバースロットを消費したり、ストリームを中断したりせずにステータスを知りたいと思っています。パイプ URL に ?progress を追加してください。開いた人は誰でもライブ HTML ダッシュボードを取得します — 転送バイト、現在の速度、ETA、状態遷移。何人が見ていてもマイグレーションはフルスピードで実行されます。
?progress はサイドチャネルの読み取りです。レシーバースロットを取得せず、バックプレッシャーを作成せず、バイトに触れません。何人が見ていても、マイグレーションはフル帯域幅で実行されます。
彼女はパイプ URL に ?progress を追加してスマートフォンのブラウザーに貼り付けます。HTML ダッシュボードが瞬時に表示されます — 状態: 待機中、0% — インストール不要、ログイン不要、レシーバースロット消費なし。
SSE は state: streaming イベントをプッシュします。プログレスバーは 22% にスナップ、バイト数がティック、MB/s は 118 に落ち着きます。ダッシュボードは単一ページリロードなしで 250ms ごとに自身を更新します。
彼女はタブを閉じます。彼女のスペクテーター接続は切断されます。マイグレーションは気付きません — データパスに決していなかったからです。送信側とその 1 つの実際のレシーバーは続行します。
彼女は日の出に URL を再度開きます。ダッシュボードは完了イベントを表示します: 7.6 GB 転送、8h 2m、エラーなし。サーバー側の状態はリフレッシュ後も保持されます — 遅参者は常に最後の行を見られます。
彼女は URL をチーム Slack に転送します。3 人のエンジニアが開いて同じ完了状態を見ます。閉じるべきステータススレッドなし、スター外しすべき Grafana パネルなし。1 つの URL、5 人の証人、ゼロ中断。
# 1. Sender — eight-hour migration. Same as always.
tar czf - /var/lib/postgres | curl -T - "$PIPE/api/v1/pipe/migration"
# 2. Receiver — the only client that matters for backpressure.
curl "$PIPE/api/v1/pipe/migration" | tar xzf - -C /restore
# 3. Boss opens the URL on her phone. HTML dashboard. No setup.
# => https://pipe.hoody.com/api/v1/pipe/migration?progress
# 4. You want SSE for a Slack bot? Same URL, different Accept.
curl -N -H "Accept: text/event-stream" \
"$PIPE/api/v1/pipe/migration?progress" \
| grep -E '^event: (progress|state|done)'
# event: state \n data: '{'"state":"streaming","receivers":1'}'
# event: progress \n data: '{'"bytes":5046464512,"mbps":118,"etaSec":840'}'
# event: done \n data: '{'"bytes":8160000000,"durationSec":28800'}'3 つの SSE イベントタイプ。state は遷移用 (idle → waiting → streaming → complete)、progress はバイトが流れている間 250ms ごと (bytesTransferred、speed、ETA)、done は最後に最終統計と共に 1 回。パスごとに最大 50 人のスペクテーター、それぞれ 5 分の接続ウィンドウ。
?progress はサイドチャネルです。ボス、同僚、外部クライアント、オンコール — すべてが同じ URL を開きます。誰も転送に影響しません。全員が同じライブ状態を見ます。
スマートフォンで URL をブックマーク。1 日 2 回チェック。
HTML ダッシュボード、ログインなしSSE を Slack Webhook にカール。1 行のステータスボット。
text/event-stream、同じ URL公開ステータスページに埋め込み。30 秒ごとにポーリング。
0 レシーバースロット、完全なライブ状態完了イベント経由で PagerDuty に配線。完了時にピング。
event: done、ワンショットトリガーマイグレーションを見ること自体がそれ専用の URL です。マイグレーションはそれに気づきません。
どのチームにも「どこまで進んだか」に答える方法があります。そのほとんどは、実行するサービス、配線するダッシュボード、世話するチャットチャンネルが必要です。パイプ URL のクエリパラメーターはそのどれも必要ありません。
URL を送ってください。アップデートを送るのをやめてください。