---
title: "客家工程師的生存法則，serverless 好不好一試就知道"
description: "雲端是迷人，但收到帳單那一刻，真的令人焦慮"
author: "kidneyweakx"
published: 2025-08-28T00:00:00.000Z
updated: 2026-10-29T10:17:47.589Z
lang: zh-TW
tags: ["serverless", "cloudflare", "隨筆"]
canonical: https://kidneyweakx.com/blog/live-for-serverless
---

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

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

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

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

<br />

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

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

<br />

流量要錢、運算要錢，這我認了。但當你發現，為了維持一個一天沒幾個人用的服務，卻要付一筆固定的基礎設施月費時，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 都砍了。

<br />

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

會砍掉 DB，是因為之前真的有被 serverless 接資料庫這件事搞過。這裡先講重點，為什麼會爆、能直接抄的寫法，我另外整理在〈[小心連接池，serverless 連接資料庫的小陷阱](https://kidneyweakx.com/blog/serverless-db-connection-pitfalls)〉。

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

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

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

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

<br />

解法大概有三條路：

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/<slug>.md`，前台的 Worker 只拿得到 R2 的唯讀權限。**最好的連接池，就是不用連接池**。

## 但 serverless 也不是免費的午餐

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

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

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

<br />

## 一試就知道

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

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