跳转到内容
类型解锁
阶段快速获胜
难度简单
工作监控服务
用于开发团队
用于DevOps & 基础设施
服务管道
为何选 HoodyHTTP 原生
为何选 Hoody默认多人协作
类型解锁
阶段快速获胜
难度简单
工作监控服务
用于开发团队
用于DevOps & 基础设施
服务管道
为何选 HoodyHTTP 原生
为何选 Hoody默认多人协作
类型解锁
阶段快速获胜
难度简单
工作监控服务
用于开发团队
用于DevOps & 基础设施
服务管道
为何选 HoodyHTTP 原生
为何选 Hoody默认多人协作
类型解锁
阶段快速获胜
难度简单
工作监控服务
用于开发团队
用于DevOps & 基础设施
服务管道
为何选 HoodyHTTP 原生
为何选 Hoody默认多人协作
PIPE · ?PROGRESS · SSE

老板可以围观但无需加入的进度条

你在跑一次八小时的迁移。五个人想知道状态,但又不想占用接收槽或打断数据流。在 pipe URL 后追加 ?progress。任何打开它的人都能看到一个实时 HTML 仪表盘——已传输字节、当前速度、ETA、状态切换。无论多少双眼睛在看,迁移都以全速运行。

阅读 pipe progress 文档

一个查询参数如何变成实时仪表盘

?progress 是对 pipe 路径的另一次独立读取,它监听传输状态而不占用接收槽。迁移察觉不到它。浏览器看到的是 HTML 仪表盘;curl 看到的是干净的 SSE 流。

观察者时间线零接收槽位
T+0 min
BOSS OPENS URL

她把带 ?progress 的 pipe URL 粘进手机浏览器。HTML 仪表盘瞬间出现——状态:waiting,0%——无需安装,无需登录,也不占用任何 receiver 名额。

T+22 min
STREAM IS LIVE

SSE 推送一个 state: streaming 事件。进度条跳到 22%,字节数往上走,MB/s 稳定在 118。仪表盘每 250 ms 自动刷新,没有一次页面重载。

T+4 h
BOSS GOES TO BED

她关掉标签页。她的旁观连接断开。迁移毫无察觉——它从不在数据通路上。sender 和它唯一真正的 receiver 继续跑。

T+8 h
WAKES TO 100%

天亮时她重新打开 URL。仪表盘显示一个 done 事件:已传输 7.6 GB,耗时 8h 2m,无错误。服务端状态在刷新后依旧保留——晚到的人总能看到最后一行。

T+8h 4m
SENDS THE ACK

她把 URL 转发到团队 Slack。三名工程师打开后看到同样的 done 状态。没有要关闭的状态讨论串,没有要取消收藏的 Grafana 面板。一个 URL,五个见证者,零打扰。

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]

三种 SSE 事件类型。state 用于状态切换(idle → waiting → streaming → complete),progress 在字节流动时每 250ms 推送一次(bytesTransferred、speed、ETA),done 在结束时推送一次最终统计。每条路径最多五十名旁观者,连接 TTL 三十分钟,传输后保留三十秒以便后到的人看到成功的那一行。

三种受众,一个 URL

同一个 ?progress 端点服务于浏览器标签页、curl 管道和后台轮询的状态页。它们都不会拖慢传输。

围观迁移本身就是一个 URL。迁移察觉不到。

0 个接收槽被占用每条路径最多 50 名旁观者
迁移1 个发送方、1 个接收方、满带宽
旁观者12 双老板的眼睛盯着仪表盘,0 背压
  • 无需照看 Slack 频道
  • 无需接 Grafana 仪表盘
  • 无需自写进度端点

这取代了什么

每个团队都有一种回答“进度到哪了?”的方式。这些方式里,大部分都需要运行一个服务、接一个仪表盘、或照看一个聊天频道。在 pipe URL 上加一个查询参数则不需要其中任何一项。

  • Slack #migrations 频道更新一个人每五分钟敲一次百分比
  • Grafana 仪表盘一个 exporter、一个 Prometheus 抓取、一个要维护的面板
  • 自定义进度端点定制路由、定制 schema、定制保留期 bug
  • 通过 SSH 共享 Tmux为了看一个数字往上跳还要堡垒机访问权限
  • Datadog 指标面板为一次传输支付每主机 agent 和每指标价格
  • 「到了没?」催问五个队友在不同线程里问同一个问题

发出 URL。停止发送状态更新。

阅读 pipe API 指南

阅读其他内容