FastComments.com Blog

Sun Mar 29 2026
...

FastComments 準備好進軍太空了!

! 本文包含技術術語

新聞

每個 FastComments point-of-presence 現在都可以在本地寫入,並且異步複製到所有其他節點。這將比以前的系統提供更高的耐用性,同時在某些地區使得審核工具的速度更快,雖然有一些取捨。

「準備好進軍太空」這個說法有點樂觀,但這個想法是我們可以將 FastComments 部署到不同的行星,最終系統會保持同步。然而,冥王星上的用戶需要等待大約一天才能在即將到來的發票頁面上看到變更,因為目前每個區域只能有一個主節點來聚合計費資訊。

一些歷史,為什麼要更改

當 FastComments 最初啟動時,我們有一個非常典型的架構。我們有一個代理層,一個應用層,一個資料庫,一些副本,後來在不同地區和雲供應商之間設置了額外的副本以增加冗餘。

最終,我們將資料庫副本移至大多數用戶所在的所有區域,並且在那裡部署了應用程序,並創建了自己的 DNS 和代理系統(在以後的博客文章中描述)以將請求路由到最近的應用節點。這使得讀取速度很快,但寫入速度較慢,因為現在不再需要等待一次 HTTP 的往返通訊到後端,而是等待一次 HTTP 往返通訊到一個接近的節點,而那個節點可能會對主節點進行多次資料庫寫入。這樣不好!

因此,為了解決這個問題,我們重組了應用程序的許多區域,以在函數參數中採用 readPreference,讓調用者可以決定他們能接受的讀取延遲程度,除此之外,還使得更多的寫入(例如,在管理行為上寫入管理員統計數據)採取 fire-and-forget 的方式。雖然不是理想的解決方案,但它大大加快了速度。

我們在全球運行 Mongo 時遇到的一個問題是網路分裂。如果足夠多的節點被切斷,讀取會停止,因為每個節點都無法確定是否能夠提供讀取服務。有一些解決方式,但邊緣案例會變得凌亂。這不是一個理論問題 - 它發生過多次,造成了凌晨 3 點的警報,我們對此感到厭惡,甚至嘗試調整 Mongo 以應對最多一分鐘的複製集選舉不確定性。然而,舉例來說,從聖保羅到法爾肯斯坦的網路在我們的一些托管供應商之間並不是很好。調整擁塞控制等有幫助但並未解決問題。

如果你能接受某些取捨,完美的解決方案就是在該節點本地接受寫入(該節點有良好的硬體、RAID 等,不太可能崩潰),並告訴用戶他們的資料已經保存。在該 point-of-presence 中,你也可以保持第二個節點作為熱副本以增加耐用性。

這就是我們所達成的結果。俄勒岡、維吉尼亞、法爾肯斯坦、聖保羅、新加坡都各自擁有自己的複製集,並接受寫入。歐盟的部署(雖然只有三個 PoP)具有相同的行為。

它是如何運作的

這部分在前面的部分已有涵蓋,但簡而言之,它是 CRDT-lite。我們創建了一個代理(使用 Rust,因為當然)坐落於應用程序與 Mongo 之間,使其成為多主集群。該代理是同伴感知型,管理檢查點、複製、監控和初始同步。它是 Mongo 的複製系統的多主替代方案,包括某些 DDL 命令。

與其他工具的不同之處在於這 不會監聽 oplog。監聽 oplog 或使用變更流是不可行的,因為它們只顯示寫入後對象的最終狀態,使得處理衝突變得不可能。你需要捕獲每個 $set$inc 操作並複製該操作本身。

這是一個特定領域的解決方案。它不適用於所有產品。可以說它是基於領域的設計 :)。對我們來說是可行的,因為我們從一開始就非常小心地只在文檔中 $set 變更的字段 - 我們從不使用 Mongo 的 replaceOne,例如。計數器也是如此。你 永遠不會執行 SET VOTES = 5。相反,你會寫 INCREMENT VOTES BY 5,因為這樣可以實現最終的一致性。分佈式鎖由 處理。每個集群僅有一個節點設置旗標以運行 cron。雖然這似乎有限,但我們可以購買具有數 TB RAM 的伺服器,因此可以接受這種取捨,以降低風險和複雜性。

讀取自己的寫入

對於使用 API 的開發者,你應該能夠像以前一樣讀取自己的寫入(進行 API 調用以創建評論,然後列出評論並在該列表中看到新的條目)。注意是你無法跨區讀取。如果你的後端僅在一個區域內運行,例如 us-west,那麼除了在你寫入與讀取之間,該節點失效 並且 你的 DNS 快取更新指向下一個最近的節點外,你應該能夠讀取自己的寫入。如果未發生此情況,則讀取自己的寫入是可靠的。

你也可以固定你所訪問的 point-of-presence。更多資訊請見此處。

測試與遷移

系統中大約一半的代碼是測試工具、框架和測試。不過,發布過程有點崎嶇,歐盟需要的停機時間(1 小時)和全球範圍(20 分鐘)比預期的時間長,但我們很高興我們通過了這個里程碑,感謝你的耐心等待!

總結與對你的意義

FastComments 現在應該比以往更快、更耐用,現在我們可以回去專注於功能開發 :)

乾杯!