コンテンツにスキップ
use-cases / a-progress-bar-your-boss-can-spectate / hero
PIPE · ?PROGRESS · SSE

上司が参加せずに観戦できるプログレスバー

8 時間のマイグレーションを実行中です。5 人がレシーバースロットを消費したり、ストリームを中断したりせずにステータスを知りたいと思っています。パイプ URL に ?progress を追加してください。開いた人は誰でもライブ HTML ダッシュボードを取得します — 転送バイト、現在の速度、ETA、状態遷移。何人が見ていてもマイグレーションはフルスピードで実行されます。

use-cases / a-progress-bar-your-boss-can-spectate / mechanism

ボスがストリームに触れずに見守る方法

?progress はサイドチャネルの読み取りです。レシーバースロットを取得せず、バックプレッシャーを作成せず、バイトに触れません。何人が見ていても、マイグレーションはフル帯域幅で実行されます。

SPECTATOR TIMELINEZERO RECEIVER SLOTS
T+0 min
BOSS OPENS URL

彼女はパイプ URL に ?progress を追加してスマートフォンのブラウザーに貼り付けます。HTML ダッシュボードが瞬時に表示されます — 状態: 待機中、0% — インストール不要、ログイン不要、レシーバースロット消費なし。

T+22 min
STREAM IS LIVE

SSE は state: streaming イベントをプッシュします。プログレスバーは 22% にスナップ、バイト数がティック、MB/s は 118 に落ち着きます。ダッシュボードは単一ページリロードなしで 250ms ごとに自身を更新します。

T+4 h
BOSS GOES TO BED

彼女はタブを閉じます。彼女のスペクテーター接続は切断されます。マイグレーションは気付きません — データパスに決していなかったからです。送信側とその 1 つの実際のレシーバーは続行します。

T+8 h
WAKES TO 100%

彼女は日の出に URL を再度開きます。ダッシュボードは完了イベントを表示します: 7.6 GB 転送、8h 2m、エラーなし。サーバー側の状態はリフレッシュ後も保持されます — 遅参者は常に最後の行を見られます。

T+8h 4m
SENDS THE ACK

彼女は URL をチーム Slack に転送します。3 人のエンジニアが開いて同じ完了状態を見ます。閉じるべきステータススレッドなし、スター外しすべき Grafana パネルなし。1 つの URL、5 人の証人、ゼロ中断。

spectate.sh
# 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 分の接続ウィンドウ。

use-cases / a-progress-bar-your-boss-can-spectate / audience

すべてのステークホルダー、1 つの読み取り専用 URL

?progress はサイドチャネルです。ボス、同僚、外部クライアント、オンコール — すべてが同じ URL を開きます。誰も転送に影響しません。全員が同じライブ状態を見ます。

use-cases / a-progress-bar-your-boss-can-spectate / punchline

マイグレーションを見ること自体がそれ専用の URL です。マイグレーションはそれに気づきません。

使用したレシーバースロット 0パスごとに最大 50 人の観戦者
MIGRATION送信者 1、レシーバー 1、フルバンド幅
SPECTATORSダッシュボードを見る上司の目 12 個、バックプレッシャー 0
  • 世話する Slack チャンネルなし
  • 配線する Grafana ダッシュボードなし
  • 書くプログレスエンドポイントなし
use-cases / a-progress-bar-your-boss-can-spectate / replaces

これが置き換えるもの

どのチームにも「どこまで進んだか」に答える方法があります。そのほとんどは、実行するサービス、配線するダッシュボード、世話するチャットチャンネルが必要です。パイプ URL のクエリパラメーターはそのどれも必要ありません。

  • Slack #migrations チャンネルアップデート5 分ごとにパーセンテージを入力する人間
  • Grafana ダッシュボードエクスポーター、Prometheus スクレイプ、維持するパネル
  • カスタムプログレスエンドポイントカスタムルート、カスタムスキーマ、カスタム保持バグ
  • SSH 経由の tmux 共有数字が増えるのを見るためだけのバスティオンアクセス
  • Datadog メトリックパネル1 回の転送のためのホスト単位エージェントとメトリック単位の課金
  • 「まだ着かない?」ピング5 人のチームメイトが別々のスレッドで同じ質問
use-cases / a-progress-bar-your-boss-can-spectate / cta

URL を送ってください。アップデートを送るのをやめてください。

パイプ API ガイドを読む
use-cases / a-progress-bar-your-boss-can-spectate / related

他のユースケースを読む