為什麼你不應該使用 MongoDB

来源:http://www.cnblogs.com/jielesi/archive/2016/01/11/5122123.html
-Advertisement-
Play Games

本文轉載自:http://www.oschina.net/translate/why-you-should-never-use-mongodb(只作轉載, 不代表本站和博主同意文中觀點或證實文中信息)免責聲明:我不構建資料庫引擎,但搭建Web應用。每年我大約跑4-6個不同項目,所以我搭建了不少Web...


本文轉載自: http://www.oschina.net/translate/why-you-should-never-use-mongodb 
(只作轉載, 不代表本站和博主同意文中觀點或證實文中信息)

免責聲明:我不構建資料庫引擎,但搭建Web應用。每年我大約跑4-6個不同項目,所以我搭建了不少Web應用。我經歷過有不同需求及不同的數據存儲需求的應用。我部署過你聽說過或沒聽說過的的大部分數據存儲。

我也有幾次做出了錯誤的選擇。這是一個關於其中一次的故事——原本我們為什麼選擇它,我們是如何發現它不合適,以及我們如何修複的。這一切都發生在一個開放源碼的名為Diaspora的項目中。

 

Diaspora項目

Diaspora 是一個有著悠久歷史的分散式社交網路。早在2010年初,紐約大學四名大學生創建了一個Kickstarter視頻,目的是募集10000美元,耗費一個夏天來構建一個替代Facebook的分散式項目。他們將它發送給朋友和家人,並希望有最好的結果。

但他們觸到了痛處。當時正好有另一起關於Facebook的隱私醜聞,當塵埃落定,回到他們的Kickstarter項目時,他們已經從6400個不同的人那裡籌集了超過200000美元,而同時這個軟體項目,卻連一行代碼都還沒有寫出來。

Diaspora是第一個大大超越其目標的Kickstarter項目。其結局是,他們的項目新聞被刊登於紐約時報——但它變成了一個醜聞,因為團隊照片的背景黑板上面有一個骯髒的笑話,直到最終印刷都沒有人註意到這一點。這可是刊登在紐約時報!這個事件的餘波實際上是我第一次聽說到這個項目。

 

他們在Kickstarter上成功的結果,是離開學校,來到San Francisco開始寫代碼。他們最後在我的辦公室工作。那時我在Pivotal實驗室工作,他們的一個哥哥也在那工作,所以Pivotal給他們提供了免費的辦公空間、網路,當然,裝有啤酒的冰箱。我白天和官方客戶工作,下班後和他們一起玩,周末貢獻代碼。

他們最後在Pivotal待了兩年多的時間。雖然只是在第一個暑假的結尾,他們已經有了一個最小化的,但已經可以使用(在某種意義上說)的一個分散式社交網路,以Ruby on Rails實現,後端用MongoDB。

這裡有很多流行辭彙,讓我們把它分解來看。

 

“分散式社交網路”

如果你看過《社交網路》,你就知道了所有你需要知道的關於Facebook的事。它是個web應用,它在一個單邏輯伺服器上運行,它可以讓你與朋友保持聯繫。一旦你登錄,Diaspora的界面在結構上與Facebook很相似:

Diaspora用戶界面的截圖

在中間有個信息流,顯示你所有朋友發佈的信息,在邊上有一些其他隨機的基本沒人關註過的東西。Diaspora和Facebook主要的技術差異在於對終端用戶的不可見性:它是“分佈的”部分。

 

Diaspora的基礎設施並不在一個單獨的網路地址上。有幾百個獨立的Diaspora伺服器。代碼是開源的,所以如果你願意,你可以建立自己的伺服器。各個伺服器,被稱作一個pod,有它自己的資料庫和自己的用戶集合,並可以與其他擁有各自資料庫和用戶集的Diaspora pod進行交互操作。

不同規模的Pod互相交流,而沒有一個中央樞紐。

 

每個pod通過基於HTTP的API與其它pod通信。一旦你在一個pod上創建了一個帳號,它其實相當無聊,除非你關註一些其他人。你可以在你的pod上關註其他用戶,而且你也可以關註其它pod上的用戶。當你關註的人在另一個pod上發佈一個更新時,將會發生這些事情:

 

  1. 該更新會進入作者的pod的資料庫。
  2. 你的pod會通過API收到通知。
  3. 該更新被存入你的pod的資料庫。
  4. 你可以看看近期活動,將會發現這個發佈與你關註的其他人的發佈混在一起。

評論按同樣的方式運作。在任何單一的發佈中,一些評論的評論人可能來自與發佈作者相同的pod,而還有一些可能來自其他的pod。任何有權查看這個發佈的人將會看到所有的評論,就像你期待的,好像每個人都在一個單一的邏輯伺服器上一樣。

 

誰關心?

這個架構有技術上和法律上的優勢。技術上的主要優勢在於容錯機制

這是每個辦公室都應該有的一個重要的容錯系統。

如果pod中的任意一個宕機,這不會引起其他的也宕機。系統的生存,甚至期望,網路的分割。對於這,有一些有趣的政治上的暗示——例如,如果你在一個關閉了外接網路而無法訪問Facebook和Twitter的國家,你的pod依舊會在本地運行,並和你所在國家內的其他人相連接,即使無法訪問外部。

 

主要的法律優勢是伺服器的獨立性。每個pod都是一個法律獨立的實體,由其創建所在地的法律所掌管。每個pod也設置自己的服務條款。對於其中的大多數,你可以在不放棄對內容許可權的條件下發佈內容,這與Facebook不同。Diaspora是一個免費的軟體,其意義在於“免費”和“自由”,而且大多數運行pod的人非常在意這種事情。

所以這就是這個系統的架構。我們再來從一個單一的pod看看這個架構。

 

這是一個 Rails 應用

每個pod都是一個Ruby on Rails應用,後端有一個資料庫,最初是MongoDB。從某種程度來說,這個代碼庫是一個‘典型’的Rails應用——它同時具有一個可視化與可編程的UI,一些Ruby代碼,以及一個資料庫。但在其他方面,它決不是典型的。

一個 Diaspora pod的內部結構

視覺UI顯然就是網站用戶與Diaspora交互的方式。這個API被各種Diaspora移動客戶端使用——這一部分相當典型——但同時它也被用於"federation"(聯邦),這也是描述pod之間通訊的技術名詞。(我有一次問過這與羅慕倫人的相似點在哪裡,結果得到一堆白眼,擦。)所以說這個系統的分散式特性,給代碼庫增加了典型應用中所不存在的中間層。

當然,MongoDB是一種數據存儲的典型選擇。而絕大多數的Rails應用程式是由PostgreSQL(近來不常見)或MySQL所支持。

所以代碼部分就是這樣。我們再來考慮一下我們存儲的是什麼樣的數據。

(譯註:羅慕倫帝國是科幻系列《星際旅行》中虛構的外星帝國,2158年,羅慕倫帝國與當時的地球聯邦發生了一場核戰爭。這場戰爭同時威脅到了其他的一些種族,並最終促使了星際聯邦的建立。2160年羅慕倫人被打敗,後與星際聯邦簽訂合約並劃定中立區。)

 

我不認為單詞的意思是你認為的意思

“社交數據”是關於我們朋友、他們朋友和他們活動的網路信息。從概念上來看,我們確實認為它是一個網路——一個以我們為中心,朋友圍繞在我們身邊的無向網路。

所有照片來自rubyfriends.com。感謝Matt Rogers、Steve Klabnik、Nell Shamrell、Katrina Owen、Sam Livingston-Grey、Josh Susser、Akshay Khole、Pradyumna Dandwate和Hephzibah Watharkar對#rubyfriends的貢獻!

當我們存儲社交數據時,我們存儲的是那個圖的拓撲結構,和那些隨著邊移動的活動信息。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、簡介 游戲目標:在地下城的最底層取得炎多的護符項鏈(Amulet of Yendor),並返回最上層,在聖祭壇上供奉給神靈。完成整個游戲的獎賞是,玩家會成為不朽的半神。 二、安裝 1)下載源碼 http://www.nethack.org/v360/downloads.html 2)編譯安裝 c...
  • Linux安裝tomcat。
  • 安裝svn需要依賴apr和apr-util這兩個軟體,所以先安裝這兩個軟體下載安裝APRwget http://apache.fayea.com//apr/apr-1.5.2.tar.gztar -zxvf apr-1.5.2.tar.gzcd apr-1.5.2./configure --pref...
  • Linux視頻教程集:序列之一:Linux基本操作和系統管理序列之二:Linux_C編程(IO+多線程+進程管理+進程通信+網路)序列之三:C++精講精煉(語法+STL+IO編程)序列之四:Qt編程式列之五:ARM嵌入式Linux開發(ARM硬體體系+指令集彙編+Linux開發) 鏈接序列1鏈接: ...
  • 概述 SQLite提供了一系列介面供用戶訪問資料庫,主要包括連接資料庫,處理SQL,迭代查詢結果等。本文會針對我們使用SQLite的主要場景,列出核心的API,詳細介紹API的用法並給出代碼用例。1.打開關閉資料庫sqlite3_open_v2原型:int sqlite3_open_v2(cons....
  • 本文轉至:http://database.51cto.com/art/201503/469510_all.htm(只作轉載, 不代表本站和博主同意文中觀點或證實文中信息)Olery成立於2010年,總部位於阿姆斯特丹。該初創公司為酒店行業提供聲譽管理與媒體監控工具,幫助酒店將網路評論和社交媒體反饋轉...
  • 本文轉載自:http://www.innomysql.net/article/23959.html(只作轉載, 不代表本站和博主同意文中觀點或證實文中信息)工作10餘年,沒有一個版本能像MySQL 5.7那樣令我激動與期盼,10月MySQL 5.7 GA版本的發佈,意味著MySQL資料庫終於有能力在...
  • ---------------原創內容,轉載請註明出處。------------一、概述RRDtool(round-robin database tool),即輪詢式資料庫工具(註:並不等同於電腦中的輪詢調度演算法),採用固定大小的空間來存儲數據,設定一個指針,隨數據的讀寫移動,指向最後更新的數據的...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...