Redis is not "open core"

Salvatore Sanfilippo

Redis 不是「開放核心」

原文由 Salvatore Sanfilippo 發布,訂閱此部落格

人類有一種很強的傾向,會把新的事實硬套進既有的分類裡。這麼做有助於我們在心智上與文化上,把相似的事件歸到同一個邏輯框架下,所以兩天前當我澄清 Redis 核心仍以原汁原味的 BSD 授權釋出,只有部分由 Redis Labs 開發的 Redis 模組將改變授權,從 AGPL 改為另一種非開源授權時,大家就說:「啊!懂了,你們要走開放核心了。」

但這次的簡化,如果你真想弄清楚這裡到底發生了什麼,就行不通了。開放核心技術需要兩個條件。一是系統本身是模組化的,二是把系統中的某些部分變成專有軟體,以便在原本自由的軟體之外打造出產品。舉例來說,只把資料庫的單節點以開源形式提供,卻把叢集的邏輯與機制實作在另一個非自由的層次裡,就是一種開放核心技術。同樣地,如果我寫了一個具有模組化儲存系統的關聯式資料庫,但唯一能提供強保證的儲存引擎卻是非自由的,那也屬於開放核心。在圍繞開源系統的開放核心商業模式中,*最關鍵的*就是你從自由軟體的那一部分拿掉了某些有用的東西。

如今 Redis 已經是一個模組化系統好一段時間了。你可以利用 Redis 模組來實作很多東西,包括利用最近才引進的叢集訊息匯流排 API 來打造新的分散式系統,或是看起來就像原生一樣的全新資料型別。然而,讓 Redis 模組化的原因,並不是為了把系統中某些有用的東西拿掉然後貼上價格標籤。舉例來說,Redis 5 的其中一個新資料結構 streams,就是核心的一部分,並以 BSD 授權釋出。Streams 是在 Redis 已經是模組化系統之後才實作的。

Redis 模組的起點是出於不同的觀察。作為前提,我得先說我在軟體開發上是個非常保守的人。我認為 Redis 應該專注於處理那些透過操作記憶體內資料結構,能比其他做法帶來明顯優勢的事情。我不希望 Redis 去做比現在更多的事情,也不希望它採用每一種可能的一致性取捨。我希望 Redis 就是 Redis,也就是開發者可以用不同方式來解決特定問題的通用工具。

然而在 Redis Labs,我們不只一次觀察到,Redis 無法解決某些特定問題其實有點可惜。比方說,如果 Redis 是一個像樣的全文搜尋引擎會怎麼樣?還有,開發者那麼想要 JSON,那提供一個能直接用 JSON 溝通的 API 又如何?而且既然記憶體內的圖結構如果設計得當可以非常快,那具備圖資料庫能力、加上豐富的查詢語言又如何?Redis Labs 的客戶也常常直接要求這些功能。而實際上,這些功能或許很酷,但那就不是 Redis 了,我沒興趣,而且 Redis 開源這邊也沒有足夠的開發人力去維持這些東西,順帶一提。這對 Redis 和 Redis Labs 雙方來說反而是一大優勢:在內部只要負擔我和另外幾位 OSS 開發者的時間相對便宜,同時把其餘資源投入到對 Redis Labs 事業有用的開發上,例如確保 Redis 企業版 SaaS 和產品夠好。無論如何,社群還是貢獻了大量程式碼。而我也不斷對那些會把 Redis 帶往其他領域的華麗點子說「不」……這本身也是一個問題。

話雖如此,能擁有這些類似 Redis 卻在 Redis 範疇之外的東西,還是很酷的,因為你知道,雖然那不是 Redis 的使命,但人們確實可能會需要一個能即時寫入、同時每個核心又能處理大量查詢的快速反向索引全文搜尋功能。這正是 Redis Labs 在做的事,它運用同樣的 Redis 技術與思維,去做比 Redis 原本想做的更多的事。不只是在功能面上,也包括像一致性模型這類的其他面向。我對某些事情很有自己的堅持,例如我認為 CRDT 雖然在某些使用情境下超酷,但對 Redis 而言並不是正確的選擇,如果要維持同樣的記憶體佔用、效能與簡潔性,即便代價是擁有較弱的一致性模型。所以 Redis Labs 和該領域的一位頂尖研究者一起把它做出來了(而且這是一個完全不提供原始碼的專有產品)。我能理解這樣的功能對某些應用場景會非常有用,但 Redis 本來就不是要解決所有問題,而 Redis Labs 把它做了出來。

這不是開放核心。Redis Labs 正在做那些你永遠不會看到我去做的事:是出於人力的限制,也是因為我相信並非所有軟體最終都必須變得巨大無比。

所以我認為把這種模式稱為「開放核心」是誤導的,沒有任何東西從 Redis 的桌上被拿走,只是在 Redis 專案原本未觸及的其他領域,嘗試依循「Redis 之道」去探索新的事物。

本文章由 muse-spark-1.2-contributor 進行翻譯

留言