
唉呀,大孫女、小孫女,來,快跟爺爺坐在這張舒服的老藤椅上。傍晚的風越來越涼了,爺爺趕緊用這壺剛泡好的溫熱琥珀熱茶,給你們兩個溫一溫手。
大孫女最懂事,一邊接過茶杯,一邊攤開她的系統架構筆記本;小孫女則靠在爺爺懷裡撒嬌,一邊看著天邊那一抹漸漸暗下來的晚霞暮紫,一邊好奇地問:「爺爺,我們 NewsHub 新聞平台要是以後受歡迎了,成千上萬的人同時進來用,我們的資料庫會不會累垮呀?」
爺爺摸摸你們的小腦袋,慢條斯理地笑著說:大孫女、小孫女,這就是我們今天第 27 天要講的核心——高可擴展的漸進式架構。做系統設計和我們在院子裡種花是一樣的道理,不能一開始就大費周章、過度設計,也不能等到水淹金山才慌忙應對。
今天,爺爺就跟你們講講,NewsHub 怎麼從 SQLite 平滑擴展到 PostgreSQL 與 Redis。
很多年輕的工程師啊,在專案剛開始(也就是 MVP 最小可行性產品階段)時,就恨不得把分散式資料庫、分散式快取、負載均衡器通通部署上去。這就像是我們家院子才剛要種兩顆菜種子,你就大費周章去租了一台巨型農耕機和自動噴灌系統。結果菜還沒發芽,你就已經累倒在田裡、把積蓄花光了,反而拖慢了系統上線的黃金時機。
但是呢,等我們的 NewsHub 真的做成功了,成百上千個用戶同時進來搜尋,多個 RSS 採集排程在背景不間斷地抓取、還有 AI 摘要引擎不停地寫入資料。這時候,如果我們還死守著最初的「單機檔案資料庫」,它就會因為無法承受高並發的讀寫,開始頻頻出現鎖定(Database Locked)或延遲,最後直接罷工。
為了解決這個矛盾,爺爺在 NewsHub 規格書 裡,特別設計了一套能隨著業務規模平滑成長的資料儲存方案:
在專案剛起步、需要快速部署以驗證核心價值的 MVP 階段,我們採用輕量、免安裝、零設定的 SQLite。
當 NewsHub 走向企業級規模,採集隊列(Ingestion Queue)與並發查詢流量暴增時,我們便能平滑切換到更強大的架構:
pg_trgm 與 tsvector 進行高階全文搜尋,甚至以後想做 AI 語意搜尋時,還能直接搭配 pgvector 做向量檢索,擴充性無可匹敵!這時候,大孫女推了推眼鏡,很聰明地問了個關鍵問題:「爺爺,那我們從 SQLite 換到 PostgreSQL 的時候,代碼真的不用重寫嗎?」
爺爺呵呵笑著說,這就是系統架構師的智慧了。為了能做到真正的無痛遷移,我們在寫程式時要守住這兩道防線:
get_news_by_keyword() 方法),而底層不管是 SQLite 實作還是 PostgreSQL 實作,對業務邏輯層(Controller)來說都是完全透明的。這使得我們未來更動儲存介質時,業務代碼連一列都不需要修改!大孫女、小孫女,這漸進式的系統架構呀,就像是我們院子裡的那株小櫻花樹。
它還小的時候(MVP 階段),我們只需要用個精緻的小盆栽、澆點水(SQLite),它就能長得很好、很精神;等到它漸漸長大、枝繁葉茂了(Enterprise 階段),我們再把它平滑地移植到寬廣肥沃的大地(PostgreSQL)中,並在周圍圍上美麗的竹籬笆(Redis)保護它。這才是最省力、最優雅,也最符合自然規律的智慧。
好啦,茶也溫了,故事也聽完了。天邊那一抹晚霞暮紫已經悄悄被夜幕給蓋上了,夜風有些涼。大孫女、小孫女,快把手裡的熱茶喝完,跟爺爺一起回暖和的屋裡去,看看奶奶今天晚上煮了什麼好吃的晚飯吧!