本文轉載自: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上發佈一個更新時,將會發生這些事情:
評論按同樣的方式運作。在任何單一的發佈中,一些評論的評論人可能來自與發佈作者相同的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的貢獻! 當我們存儲社交數據時,我們存儲的是那個圖的拓撲結構,和那些隨著邊移動的活動信息。 |