PouchDB:一個開源的 JS 資料庫

發表於2016-12-20

PouchDB 是一個受 Apache CouchDB 啟發的開源JavaScript資料庫,可以完美執行在瀏覽器中。設計初衷是,幫助Web開發者構建能在本地離線執行的App,一如線上時執行的一樣。

它能讓應用程式離線時儲存資料,並在回到線上時與伺服器相容,同步資料,保持使用者資料的同步。

什麼是PouchDB?
PouchDB是CouchDB的JavaScript實現,目標是實現可以和CouchDB相媲美的API,可以在瀏覽器和Node.js執行。

什麼是CouchDB?
CouchDB是由Damien Katz於2015年寫的NoSQL資料庫,現在由Apache軟體基金會負責維護。如果你是一個JavaScript開發者,你可能每天都在用CouchDB,因為它的核心技術驅動著npm

Couchbase、CouchDB等都是什麼?
現在,有兩個資料庫的血緣可以追溯到CouchDB:Couchbase,和Cloudant。他們都是從CouchDB分離出來的產品。

然而,這三種資料庫都是使用了相同的CouchDBsync協議。這意味著PouchDB可與這三個資料庫配合使用。

換句話說,這些資料庫像是電話運營商,而CouchDB同步協議是底層的基礎技術。

CouchDB的優勢:HTTP和sync
現在已經有這麼多SQL、NoSQL資料庫了:MongoDB、PostgreSQL、MySQL等。那麼為什麼我們選擇實現CouchDB,而不是別的呢?

CouchDB的優勢有兩點:HTTP和sync。

HTTP:小而簡單的協議

當我們使用資料庫時,經常需要在資料庫和客戶端的應用之間寫類似轉換層的東西,將資料庫的查詢語句轉化成RESTful的HTTP呼叫。這些工作在編寫的每一個App中被一次次開發重複著。

CouchDB將我們拯救了出來!通過我們的客戶端App,可以直接和資料庫通訊。它使用HTTP作為主要的通訊方式,沒有特殊的協議,沒有特殊的驅動:只有REST和HTTP。你可以通過你的瀏覽器,curl或像Postman這樣的REST客戶端直接和CouchDB連線。

換句話說,CouchDB是真正“為Web而生的資料庫”。

Sync:CouchDB的殺手級特性

CouchDB另一個特性是,它從底向上都被設計成完全同步友好的資料庫。

舉個例子,如果你擔心客戶端應用的潛在危險,你可以直接在歐洲設一個CouchDB,再在北美搞一個,亞洲搞一個。在這些資料庫之間開啟雙向複製之後,客戶端就可以使用其中任何一個。

PouchDb使這一切都可以執行在你的瀏覽器裡。

討論
PaulMest:我已經使用PouchDB作為React Native應用的資料庫6個月了,用SQLite資料庫作為後端的儲存,這樣我們就可以使用裝置更多的儲存空間,而不只是50M。它工作得非常好,在一個離線快取中維護資料,然後再同步到Digtal Ocean上的CouchDB 2.0。 讓它在React native裡工作非常有挑戰性。讓我們的系統跟上PouchDB的更新也非常有挑戰性。實際上我們使用PouchDB 5.4.5,因為6.x版本中有breaking change,我還沒有時間去搞明白哪裡不相容。PouchDB社群(尤其是Nolan lawson)非常活躍,給出示例、聽取反饋回答問題等都非常積極。

ojanik:我們已經在產品環境中使用PouchDB大約15個月了。當初選擇它是因為這是一個綠色軟體,它給了我們兩個優勢:簡單的離線支援、實時同步功能,配合後端的程式很方便。因為這個東西實際上就是一個帶有本地快取的Web App,部署新版本非常簡單。

在架構方面,我們有大約有250個使用者,每個都有獨立的Couch資料庫。我們還沒有評估Couch 2.0,使用的還是Couch 1.6.

然而,我們在使用的過程中,還是遇到了一些問題:

  • 載入時間問題。當你從0開始載入一個資料庫時,非常耗時。初始化一個20-30M的資料庫大約會花15-30分鐘的時間,我們必須週期性地儲存dump的檔案,這樣節省了一些時間。不過我覺得Couch2.0的同步協議已經解決了這個問題;
  • 瀏覽器限制。當我們超過了瀏覽器的容量顯示(通常是iOS的Safari,50M),我們就不得不採取一些具有創造性的做法。現在我們的方案是,為每一個客戶執行兩個資料庫,一個是完整版本的資料庫,另一個只存在7-8天。Pouch向後者同步資料。我們在完整資料庫和臨時資料庫之間週期性地進行過濾複製。在客戶端,如果一個客戶需要7天之前的資料,就將Pouch切換到線上模式,作為一個庫從線上資料庫中取得資料;
  • 處理衝突。因為CouchDB/PouchDB是分散式的,所以當使用者基於相同的資料版本做了更新時,得當心衝突;
  • 自定義後端邏輯。因為Pouch直接與Couch連線,所以不能在需要時完自定義後端邏輯。我們必須引入一個REST後臺通道,以確保我們的後端在需要時執行額外的邏輯。

相關文章