QUEST LOG · August 28, 2025· UPDATED October 29, 2026

客家工程師的生存法則,serverless 好不好一試就知道

雲端是迷人,但收到帳單那一刻,真的令人焦慮

最近在想,身為一個客家工程師,要怎麼把手上的資源用到極致。以前在工作上雲端用得很爽,但講求資源利用率的我一直覺得:該省就省、該花就花,雲端服務的每一分價值都要榨乾。

離開公司之後,以往工作拿到的「無限雲端使用權」突然沒了。奢侈慣了,由奢入儉難,我還是把雲端工具當王之財寶一樣開好開滿,直到收到帳單那一刻才開始不爽。之前當區塊鏈工程師的時候,EC2 一開就是五顆,K8S 也是用好用滿,現在回頭算算,那每個月都是好大一筆錢。


我的教訓發生在上一個專案。當時只是要跑一個簡單的 RDB,我在 GCP 上開了託管服務,結果雲端廠商展現了什麼叫極致的雞婆:各種自動備份、監控、閒置費用,一個月光是它就噴掉 2000 台幣。專案還沒賺到錢、還沒有流量,就先被這頭邪惡的雲端巨獸坑了一筆。看著那張名目繁多的帳單,只能幹在心裡,信用卡在手裡。

狠狠被上了一課:雲端廠商的暴利,往往藏在那些百花齊放的名目裡。


流量要錢、運算要錢,這我認了。但當你發現,為了維持一個一天沒幾個人用的服務,卻要付一筆固定的基礎設施月費時,Serverless 這個選擇就變得非常關鍵。

為什麼我現在全棧轉向 Serverless,而且獨鍾 Cloudflare Workers?

# 沒人用就不用錢

答案很客家:閒置的時候,帳單是零。

傳統的託管 DB 或 VM,不管有沒有人用,機器都在那邊開著、錶都在那邊跳。Workers 是有 request 進來才算,免費方案一天就有 10 萬次請求,個人專案根本用不完。R2 存東西也沒有出站流量費,這點對放圖片的部落格來說超友善。

拿你現在看的這個部落格來說,整個站其實只有三塊:

  • 一個 blog Worker,負責前台(SvelteKit)
  • 一個 blog-cms Worker,負責後台跟 API(Elysia),前面擋一層 Cloudflare Access
  • 一個 R2 bucket,裡面放 index.json、每篇文章的 Markdown,還有圖片

沒有資料庫。 對,你沒看錯,連 DB 都砍了。


# 小心連接池:serverless 接資料庫的小陷阱

會砍掉 DB,是因為之前真的有被 serverless 接資料庫這件事搞過。這裡先講重點,為什麼會爆、能直接抄的寫法,我另外整理在〈小心連接池,serverless 連接資料庫的小陷阱〉。

傳統後端的連接池(connection pool)有一個大前提:你的程式是一個長時間活著的 process。開機時建好十條連線,之後一萬個請求輪流用這十條,大家相安無事。

但 serverless 剛好打破了這個前提:

  • 每個 isolate / function 實例都是獨立的,流量一來就同時長出一堆實例,每個實例都自己開連線
  • 實例隨時會被回收,連線不一定會好好關掉,DB 那邊就留著一堆半死不活的連線
  • Postgres、MySQL 都有 max_connections 上限,流量尖峰一來,不是你的程式掛掉,是 DB 先拒絕連線

結果就是:平常一切正常,一有流量就爆,而且爆在最需要它活著的時候。


解法大概有三條路:

  1. 換成走 HTTP 的資料庫 driver:像 Turso(libSQL)、Neon 的 serverless driver,每個查詢就是一個 HTTP 請求,沒有長連線要管
  2. 在中間放一個連接池代理:Cloudflare 的 Hyperdrive 就是做這件事,Worker 連 Hyperdrive,由它幫你維持跟 Postgres 的連線池
  3. 乾脆不要資料庫:資料量小、寫入頻率低的話,一個 JSON 索引加一堆檔案就夠了

這個部落格之前用 PayloadCMS 加 Turso,算是第一條路。後來發現,一個一個月更新一兩篇的部落格,養一個 CMS 跟一個 DB 實在太奢侈了,就直接走第三條:文章列表是 R2 上的 index.json,內文是 content/.md,前台的 Worker 只拿得到 R2 的唯讀權限。最好的連接池,就是不用連接池。

# 但 serverless 也不是免費的午餐

講了這麼多好話,還是要老實說一下代價:

  • 環境變數不是全域的:Workers 的 binding 是跟著每個 request 進來的,像 Elysia 這種習慣在 module 層拿設定的框架,就得靠 AsyncLocalStorage 把 env 一路傳下去
  • 不能動態產生程式碼:Workers 禁止 new Function 這類東西,Elysia 要關掉 AOT(aot: false)才跑得起來
  • 本地開發要習慣:我現在 wrangler dev 直接連正式的 R2,方便歸方便,手滑就是改到線上資料

這些坑都不深,但都是踩過才知道。


# 一試就知道

所以標題說的「好不好一試就知道」,我的結論是:對個人專案、低流量服務來說,serverless 真的是客家人的好朋友。沒人用就不用錢,有人用再按量付費,最壞的情況是被流量灌爆,但那時候你應該已經有錢付帳單了。

至於那 2000 台幣,就當作學費吧。至少現在每個月收到 Cloudflare 的帳單,心情是平靜的。