
POV:你把 Discord bot 部署上 Cloud Run,部署成功、log 乾淨,然後沒人傳訊息的那段時間,它就默默下線了。
進入第五週,正式聊 GCP。今天先不談 GKE,從 Cloud Run 開始,因為它是我在 GCP 上真正用起來的第一個服務,也是我最常被問的問題:「你的 agent 為什麼不直接丟 Cloud Run 就好?」答案是:有些可以,有些真的不行。關鍵不在 Cloud Run 好不好,而是你的 agent 屬於哪一種 workload。
我把 Cloud Run 濃縮成三個詞,搞懂這三個詞,大部分情境就能判斷。
request-driven:Cloud Run 的基本假設是「有 request 進來,才有事情要做」。它的世界觀很單純:HTTP request 進來、response 出去,中間跑你的容器。這跟整天掛在 Discord 上等訊息的 bot,世界觀剛好相反。
scale-to-zero:沒有進行中的 request 時,instance 數可以縮到零,這段時間不計費。對偶爾被打一下的 agent API 是福音;對主動 poll 訊息的 bot,沒 request 的空檔就是它被縮掉的時候。維持 WebSocket 的 bot 又不太一樣:那條連線本身算一個進行中的 request,不會因為閒置被縮掉,但它受 service 的 request timeout 限制,時間到就斷,client 得自己重連。
冷啟動:從零個 instance 到能回應第一個 request,中間要等容器啟動。容器越大、初始化越重(載模型、連向量庫),等得越久。你可以設 min instances 降低縮到零的機會,但那就開始付常駐的錢,跟 scale-to-zero 的初衷相反。這三個性格是一體的:你享受哪一個,就得接受另外兩個。
適合的:liaostudio 的 Whisper GPU backend。就我目前的用法,它是一段音訊送進去、字幕出來,處理完這一趟就結束,我把它當 request-driven 的 workload 在用。這種用法放 Cloud Run 幾乎是量身打造;它跑在 Cloud Run 的 L4 GPU 上,冷啟動的代價換來的是不用整天養一台 GPU 機器。Day 25 再回頭比較 Cloud Run GPU 跟 GKE GPU node pool。
不適合的:OpenAB 那群 bot。它們的本質是 always-on:長駐在 Discord 或 LINE 上,維持連線、監聽訊息、主動回應。硬塞進 Cloud Run 有兩條路:設 min instances 保留一個 warm instance(等於用 Cloud Run 的價格租一台常駐機器;而且這只降低縮到零的機會,不保證 instance 不會被換掉,長連線也仍受 request timeout 限制,重連要自己處理),或是接受它會斷線、靠重連撐著。我目前的做法是讓這些 bot 老實跑在一台 VM 的 Docker 上,每隻 bot 一個容器,部分 bot 再配一個 cloudflared tunnel 容器(Day 02)。不新潮,但貼合這種 workload 的特質。
灰色地帶:大部分時間在待命,但一接到任務就要跑很久的 agent。例如收到 webhook 後要跑一整條 pipeline 的服務。Cloud Run service 的單一 request 有逾時上限(數值以官方文件為準,見延伸閱讀),超過就得改成非同步:把長任務丟進佇列、改用 Cloud Run job 跑。這會拉高複雜度,值不值得,看這類任務的頻率。
Day 17 的 liaostudio 也在灰色地帶。它有 HTTP 入口,看起來是 request-driven,但有背景轉檔工作、狀態又留在程序裡。評估時我發現它在 Cloud Run 上只能選 instance-based 計費、也沒辦法真的擴縮,那三個性格一個都享受不到,所以暫不搬。
我後來整理出一句話:如果一段時間沒有任何人碰這個 agent,它應該繼續活著,還是可以放心死掉?
可以死掉,Cloud Run 的 scale-to-zero 就是你的盟友,冷啟動是你付的代價。必須活著,你要的是常駐服務;Cloud Run 不是不行,但你得為常駐買單,還得繞過它的執行限制,這時 GKE 或單純一台 VM 往往更誠實。
這個問題看起來簡單,卻會逼你把 agent 的生命週期想清楚,而這一步正是從會寫 agent跨到能穩定部署 agent時,最常被跳過的。
明天看另一邊:如果你決定需要真正的 K8s,GKE 的 Autopilot 跟 Standard 要怎麼選。
Cloud Run 不是萬用容器平台,它預設是有 request 進來才活的平台;要它一直在不是不行,但那是付常駐的錢,所以先釐清你的 agent 沒人理時該不該活著,再決定要不要用它。