Java開發者該如何選擇合適的NoSQL?

NoSQL Java Redis Neo4J 互聯網技術趨勢解讀 互聯網技術趨勢解讀 2017-10-17

因為了解和喜歡 Java 社區,所以儘管很少有人將 NoSQL 與某種語言綁在一起,我也要為全世界的 Java 開發者寫下這篇文章。文中,我將為你展示幾種 NoSQL 數據庫。之後,我將根據實際在 Github stars 和 Stack Overflow tags 的項目中的使用情況,選出最常用的五個。並且我會讓你知道它們是否支持 Spring Data 和 SpringBoot。

為什麼使用 NoSQL?

NoSQL 數據庫幫助許多互聯網公司通過最終一致性實現高可拓展性。因為 NoSQL 數據庫通常分佈在多臺機器上,而且有一些延遲,所以它只保證所有的實例最終都是一致的。最終一致性服務通常被稱為 BASE(基本可用,軟狀態,最終一致性)服務,這點與傳統的 ACID 正好相反。

選擇 NoSQL 的候選項

定義前五名可能很困難。最近許多人都在嘗試這個。請參考本文結尾處的研究和註釋部分。

八月中旬,我在推特上告訴我的粉絲,我正在寫這篇文章。我詢問了關於 NoSQL 數據庫的正面或負面的評述,收到了人們的反饋,其中有希望我涵蓋的一些選項。

我收到許多建議,以下按字母順序列出:

  1. ArangoDB

  2. Cassandra

  3. Couchbase

  4. DynamoDB

  5. FaunaDB

  6. Hazelcast

  7. MongoDB

  8. Neo4j

  9. PostgreSQL JSON

  10. Redis

  11. (JetBrains) Xodus

人們還提到 Hibernate OGM(NoSQL 的 JPA)和 NoSQLUnit 來作為幫助訪問和測試 NoSQL 數據庫的工具。

請注意,我沒有收到需要將 CouchDB,HBase,Elasticsearch 或 Solr 包括在內的任何請求。 由於 CouchDB 和 Couchbase 的名稱相似,它們經常被混淆,但是它們是完全不一樣的。 由於 CouchDB 是一個文件存儲數據庫,我將其包括在我的排名中。 我還添加了 HBase,因為它在 ITBusinessEdge,KDnuggets 和 DB-Engines 被提到過(在研究和註釋部分)。 我沒有將 Elasticsearch 或 Solr 包括在內,因為我相信這些並不常用作主數據存儲。

Raible 的排序技術

我用 Indeed 上職位數量、GitHub 上 star 數量、Stack Overflow 標籤數和 Docker 上 pull 的數量作為指標去開發我的 TOP5 NoSQL 數據庫排名系統。

Indeed 上職位數量

我在 Indeed Jobs 上不區分地域搜索,結果除了 Amazon 的 DynamoDB 顯示出的是排行榜的競爭者外,並沒有新奇發現。

Java開發者該如何選擇合適的NoSQL?

注意:把“PostgreSQL JSON”做為搜索條件很難得到準確的結果,因為很多招聘信息把“PostgreSQL” 作為一個要求,而不是它對 NoSQL 的支持。因此我搜索“postgres + json”。Xodus 是一家公司的名字,所以我添加“JetBrains”關鍵字來保證結果的準確。

GitHub Stars

我搜索並找到了 5 個頂級(Star 最多)的 NoSQL 項目,分別是 Redis,MongoDB,ArangoDB,Neo4j 和 Cassandra。

Java開發者該如何選擇合適的NoSQL?

注意: Cassandra, HBase 和 PostgreSQL 是鏡像庫。DynamoDB, Couchbase 和 FaunaDB 沒有服務在 GitHub 上,因此,我統計他們的時候是基於他們的 Java 驅動。統計每個項目的 Java 驅動項目的星星數量是個好辦法,但是 Redis 只有 11 顆星。

你可以使用 Tim Qian 的 歷史 star 項目來查看這 5 個項目的 star 增長情況。

Java開發者該如何選擇合適的NoSQL?

Stack Overflow 標籤

我在 StackOverflow 中搜索了上述每一個數據庫的 tag,發現 MongoDB 和 PostgreSQL 是最受歡迎的,接下來是 Neo4j, Cassandra 和 Redis.

Java開發者該如何選擇合適的NoSQL?

Docker Pulls

我在 Docker Hub 上搜索了相關的鏡像,可以看到少部分數據庫有 1000 萬以上的 Docker Pull,Neo4j 有 500 萬以上,其他的大多數也有 100 多萬, FaunaDB 和 JetBrains Xodus 暫時沒有可用的鏡像

Java開發者該如何選擇合適的NoSQL?

綜合來看,這些數據和我的排名關係並不大,我覺得可能有兩個原因,數據並不精確而且對於每一個數據庫,並沒有所謂標準的鏡像

NoSQL 選項矩陣

我創建了一個結合了職位數、星數和標籤數的矩陣表格。我根據它們在每個類別的排名授予 1-5 分。如果一個選項沒有進入前五,就得零分。結果排名前五的是 MongoDB、Redis、Cassandra、Neo4j 和 PostgreSQL,如下表所示。

Java開發者該如何選擇合適的NoSQL?

DB-Engines 排名的前五個選項是 PostgreSQL、MongoDB、Cassandra、Redis 和 HBase。

Java開發者該如何選擇合適的NoSQL?

兩個表格的前五排名非常接近!

NoSQL 選項概述

由於我做出的前五個排名結果非常接近於 DB-Engines 的結果,所以我將使用我的前五個結果。下面是對每一個的概述,以及關於它們的 Spring Boot 支持的信息。

你可能會問“為什麼是 Spring Boot?” 我的答案很簡單:因為 Spring Boot 採用率很高。根據 Redmonk 對 Java 框架的最近的觀察, Spring Boot 採用率從 2016 年 9 月到 2017 年 6 月增長了 76%。

Java開發者該如何選擇合適的NoSQL?

自 6 月以來的增長速度並沒有減緩: 到 2017 年 8月 Maven 下載量是 2220 萬。

MongoDB

MongoDB 在 2007 年由 DoubleClick、 ShopWiki 和 Gilt Groupe 的高級技術人員建立。它的源碼在 GitHub 上,使用的是 Apache 和 GNU-APGL 許可證。它的眾多大客戶包括 Adobe、 eBay 和 eHarmony。

  • 在 start.spring.io 上是否可用? 是的,包括用於測試的嵌入式 MongoDB 。

  • 是否能在 Spring Data 上獲得支持? 是的,通過 Spring Data MongoDB。

  • 加分項: 為 Hibernate OGM、 NoSQLUnit 和 JHipster 所支持。

Redis

Redis 代表 REmote Dictionary Server(遠程字典服務器),由 Salvatore Sanfilippo 開創。它最初發佈於 2009 年 4 月 10 日根據 redis.io 的描述,Redis 是採用 BSD 許可證的內存式數據結構存儲,可以被用作數據庫、緩存和消息代理。 使用 Redis 的知名企業 包括 Twitter、 GitHub、 Snapchat 和 Craigslist。

  • 是否在 start.spring.io 上可用? 是。

  • 是否為 Spring Data 所支持? 是的,通過 Spring Data Redis。

  • 加分項: 為 NoSQLUnit 所支持。Hibernate ORM 支持正在進行中。

Cassandra

Cassandra 是“一個管理結構化數據的分佈式存儲系統,其設計的目的是支持擴展到大數量級的商用服務器,並避免單點的失敗” (引至 “Cassandra – 在 P2P 網絡中的一種結構化存儲系統” 在 Facebook 的工程博客上)。Facebook 最初開發 Cassandra 用於支持其收件箱的搜索功能。它的創始人,Avinash Lakshman (Amazon DynamoDB 的一位創始者) 和 Prashant Malik 在 2008 年七月把它作為開源項目發佈。在 2009 年 3 月,Cassandra 成為了 Apache 的孵化器項目並在 2010 年 2 月成為了最高等級的項目。

除了 Facebook 之外, Cassandra 還幫助了許多企業實現網絡規模的擴展。 關於其可擴展性的介紹在其主頁上有很多驚人的數字。

其中一個最大的產品部署者是蘋果公司,有超過 75000 個節點存儲超過 10PB 的數據。其他大的 Cassandra 使用者包括 Netflix (2500 節點,420 TB,每天超過萬億的請求量),中國的搜索引擎宜搜 (270 節點,300 TB,每天超過 8 億請求),eBay (超過 100 節點, 250 TB)。

  • start.spring.io 中是否支持? 是。

  • Spring Data 中是否支持? 是,通過 Spring Data Cassandra.

  • 福利: NoSQLUnit 和 JHipster 已支持,Hibernate ORM 的支持正在進行中。

Neo4j

Neo4j 可以作為基於 GPL3 許可的“社區版”使用,帶有 Affero GPL 下的一些擴展。社區版被限制只能在一個節點上運行,並且不包括對集群或熱備份的支持。Neo4J 的“企業版”支持橫向擴展,內存頁緩存和熱備份。可以試用 30 天,沒有提供定價。

Neo4j 是眾所周知的圖數據庫,所有內容都是以一個邊,節點,或者一個屬性的方式存儲。版本 1.0 在 2010 年二月份發佈,自此以來由 Neo4j 公司開發。它的大客戶包括 Walmart, Airbnb, Monsanto, 和eBay.

  • 是否在 start.spring.io上可以使用?是。

  • Spring Data 是否支持 Neo4j ? 是的,通過 Spring Data Neo4j.

  • 加分項:Hibernate ORM 和 NoSQLUnit 也支持 Neo4j

PostgreSQL JSON

PostgreSQL 是一種傳統的關係數據庫管理系統(RDBMS),它通過其本地的 JSON 支持(在版本 9.2 中添加)來支持 NoSQL。 在 9.4 中,他們添加了對二進制 JSON(也稱為JSONB)和索引的支持。

Leigh Halliday 在 2017 年 6 月的博文中解釋瞭如何釋放在 Postgres 中存儲 JSON 的功能。Halliday進一步展示瞭如何使用 Ruby on Rails。 一篇來自 Umair Shahid 的博文展示瞭如何使用 Java 處理 PostgreSQL JSON 和 JSONB 數據。

我不確定 PostgreSQL 及其 JSON 支持是否應該被包括在推薦的 NoSQL 選項中。 但如果你已經在使用 PostgreSQL,並希望使你的數據架構能更自由流暢,那可以嘗試這麼做。 正如 Dj Walker-Morgan 所說:“PostgreSQL 9.5 不是你的下一個會選 JSON 數據庫,但它是一個非常好的關係數據庫,具有完整的 JSON 特性。”

  • 在 start.spring.io 是否可用?是的。

  • 是否由 Spring 數據支撐?是的,通過 Spring Data JPA。

結束語

我對這個分析的結果感覺很滿意,作為 JHipster 項目的提交者,我非常清楚該團隊的實力,並認為它對 MongoDB 和 Cassandra 的支持就是對它們最好的認可。並且增加對 Couchbase 的支持的工作也在進行中。

此外,我還與我熟知的 Java 和 NoSQL 社區中幾位專家分享了這一情況,並向他們詢問了以下問題:

  1. 您是否同意我選出的前 5 個 NoSQL 選項(MongoDB,Redis,Cassandra,Neo4j 和 PostgreSQL 及其 JSON 支持)?

  2. 在生產中使用這些數據庫有什麼好的壞的故事或經驗分享嗎?

  3. 在這些數據庫中,有沒有特別難以開始使用或者在長期使用過程中難以維護的?

  4. 你最喜歡的 NoSQL 數據庫是什麼?

  5. 還有什麼你想分享的?

我將在幾周後公佈採訪結果。屆時我將會在博客中更新。如果你是 NoSQL 數據庫的專家,歡迎與我取得聯繫!我很樂意將您的答案納入面試。你只需發送消息到 Twitter 的 @mraible 或 [email protected]

研究與筆結果記錄

ITBusinessEdge 有關於 NoSQL 數據庫前五名的幻燈片。 然而,那篇文章沒有日期,它聲明是 Redis Labs 做出的選擇。該幻燈片列出了 MongoDB、 Cassandra、 Redis、 Cassandra、 CouchDB 和 HBase。

KDnuggets 的編輯 Matthew Mayo,在2016年6月寫了一篇關於頂級 NoSQL 數據庫引擎的類似文章。Mayo 使用了 db-engines.com 排名 和 Google 趨勢選出了前五名:MongoDB、 Cassandra、 Redis、 HBase 和 Neo4j。

Hackernoon 有一個“值得你注意”的最受歡迎的 NoSQL 數據庫的信息圖表 。那篇文章發佈於2017年6月,評論說排名是基於 https://db-engines.com/en/ranking_trend 的統計數據。

Java開發者該如何選擇合適的NoSQL?

注意:如果你今天(2017年9月6日)查看此排名,你會看到 Redis 已經取代了 Couchbase。似乎Hackernoon 超過了 Redis?它還產生了一個問題:Elasticsearch 是 NoSQL 數據庫還是搜索引擎?Solr 應該被認為是 NoSQL 數據庫嗎?兩者均出現在 DB-Engines 排名趨勢中。

Java開發者該如何選擇合適的NoSQL?

JAXenter 在2017年3月30日發佈了他們對頂級數據庫趨勢的年度調查結果。他們將 Elasticsearch 和 Solr 列為數據庫。他們還將 Apache Spark 和 Hadoop 包括在內。MongoDB、 Cassandra、 Redis 和 Neo4j 是最有趣的 “NoSQL” 數據庫。Hazelcast 被列為頂級內存數據網格,位於 CouchDB 和 Oracle 之上。

Java開發者該如何選擇合適的NoSQL?

相關推薦

推薦中...