標籤:
本文轉載自: 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會通過API收到通知。
- 該更新被存入你的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的貢獻! 當我們儲存社交資料時,我們儲存的是那個圖的拓撲結構,和那些隨著邊移動的活動資訊。 |
為什麼你不應該使用 MongoDB