儲存過程迴光返照?SQLite邏輯和資料合併

banq發表於2024-10-14


Cloudflare迷人的新SQLite支援的“持久物件”系統,該系統鼓勵一種架構風格,您的應用程式建立數千個分散在Cloudflare網路中的小型讀寫SQLite資料庫。

Kenton Varda 介紹了 Cloudflare Durable Object平臺的下一代產品,該平臺最近從鍵/值儲存升級為基於 SQLite 的完整關係系統。

這是分散式系統設計的一個令人著迷的部分,它提倡一種非常有趣的方式來構建大規模應用程式。

Durable Objects 背後的關鍵理念是將應用程式邏輯與其操作的資料放在一起。(分分合合)

  • Durable Object 包含與其使用的 SQLite 資料庫在同一物理主機上執行的程式碼,從而實現極快的讀寫效能。

如何才能大規模地實現這一目標?
單個物件在吞吐量方面天生就受到限制,因為它在單臺機器的單個執行緒上執行。要處理更多流量,您可以建立更多物件。
當不同的物件可以處理不同的邏輯狀態單元(如不同的文件、不同的使用者或資料庫的不同“分片”)時,這是最簡單的,其中每個狀態單元的流量足夠低,可以由單個物件處理。

Kenton 給出了一個航班預訂系統的例子,其中每個航班都可以對映到一個具有自己的 SQLite 資料庫的專用持久物件——每個航空公司每天有數千個新資料庫。

每個 DO(Durable Object) 都有一個唯一的名稱,然後 Cloudflare 的網路會處理對該物件的路由請求,無論該物件位於其全球網路上的哪個位置。

技術細節非常吸引人。受Litestream的啟發,每個 DO 不斷將一系列 WAL 條目傳輸到物件儲存 - 每 16MB 或每 10 秒分批。這還可以透過重放這些已記錄的事務來實現長達 30 天的時間點恢復。

為了確保十秒視窗之外的永續性,寫入操作在提交後也會立即轉發到附近獨立資料中心的五個副本,並且只有在其中三個副本確認後才會確認該寫入。

JavaScript API 設計也很有趣:它是阻塞的而不是非同步的,因為設計的整個重點是提供快速的單執行緒永續性操作:

let docs = sql.exec(`
  SELECT title, authorId FROM documents
  ORDER BY lastModified DESC
  LIMIT 100
`).toArray();

for (let doc of docs) {
  doc.authorName = sql.exec(
    <font>"SELECT name FROM users WHERE id = ?",
    doc.authorId).one().name;
}


他們的這個例子中,故意展示了 N+1 查詢模式,因為這是 SQLite獨有的適合處理的方式。

Durable Objects 的底層系統稱為儲存中繼服務,它已經為 Cloudflare 現有但不同的D1 SQLite 系統提供支援一年多了。

相關文章