2013-01-22 73 views
3

我正在研究比簡單發送接收消息更高級的消息傳遞系統;它看起來像Facebook聊天/消息:它具有聊天功能,但也可以發送消息,如羣組消息,讀取/未讀消息等。消息傳遞服務:redis還是mongodb?

在Redis的,我只想用列表來存儲接收到的消息,例如像這樣:

myID = [ "amy|how are you?", "frank|long time no see!" ] 
amyID = [ "john|I'm good! you?" ] 

(我已經簡化它更容易閱讀都不少

但這種方式我。將無法跟蹤單個對話,因爲一旦收到消息它們都將被刷新(所以基本上沒有「收件箱」功能。

另一方面,如果我使用mongodb,我可以使用某些東西像這樣:How to keep track of a private messaging system using MongoDB?

我雖然以下優勢/劣勢:

MongoDB的

優點:

  • 可以看到收件箱視圖
  • 可以檢查讀/未讀郵件在每個會話

缺點

  • 沒有那麼快,因爲Redis的
  • 存儲容量增加了很多

Redis的

優點:

  • 容易拿起新郵件
  • 沒有存儲問題(消息被刷新)

缺點:

  • 一旦消息被髮送到客戶端都將丟失,所以沒有讀/未讀功能和
  • 沒有收件箱

任何想法?

在此先感謝。

回答

0

我認爲這裏的重點是存儲問題。你需要大量的機器或者一個很好的系統來刷新一些對話來讓你使用MongoDB。儘管想要一種「收件箱」系統......我認爲redis會更有利於工作良好的聊天系統 - 您只需要提出一些非常有創意的解決方法......或放棄設計目標。

+0

與沖洗MongoDB的問題是大於我最初雖然:顯然,當你刪除蒙戈只刪除其引用,因此,如果您刪除文件4MB的東西,它不會騰出很大的空間。只有這樣,才能真正釋放內存是運行DBREPAIR(或這條線之間的東西),基本上阻止分貝,而在另一方面運行.... –

+0

,我無法跟蹤對Redis的已讀郵件,因爲如它運行在內存,它不應該無限期地增長,但有一個可預見的大小 –

+0

@johnsmith右鍵 - 你必須做出更重要的是,或定製滿足您獨特的系統都要求的解決方案設計決策。 – PinkElephantsOnParade

6

我無法回答Redis,因爲我不使用它,從來沒有,所以我不會假裝我有。

但是,如果由於某種原因,您沒有使用像Facebook那樣的XMPP客戶端:http://www.ibm.com/developerworks/xml/tutorials/x-realtimeXMPPtut/section3.html(又名Jabber)進行聊天,那麼我將在這種情況下描述一個純粹的MongoDB解決方案。

MongoDB使用操作系統的'LRU作爲緩存文檔和查詢的手段,足夠公平的提供沒有直接的查詢緩存但是如果你很聰明,你不會需要一個;而是直接從RAM中讀取所有查詢。考慮到這一點,MongoDB 可以與Redis一樣快,因爲Redis也使用計算機RAM。

在優化查詢上兩者之間的速度可以忽略不計,我會想。速度的真正衡量來自您的模式,索引,羣集設置和您執行的查詢。

關於存儲大小的說明這裏,把你的意見考慮在內:

與沖洗MongoDB的問題比我最初雖然更大:顯然,當你刪除蒙戈東西,你只能刪除其引用,所以如果你刪除了4MB的文件,它不會釋放那麼多的空間。實際上騰出內存是運行DBREPAIR(或這條線中的東西)的唯一途徑運行基本塊分貝,而....

你似乎有關於MongoDB的究竟是如何工作的一些誤解。

這個鏈接對你有幫助:http://www.10gen.com/presentations/storage-engine-internals它將描述使用過多磁盤空間的一些原因,也將解釋你對計算機工作原理以及MongoDB如何釋放空間和重用它的一些誤解。

MongoDB不會釋放記錄級別的空間。相反,它會發送該「空」記錄(記錄和文檔是演示文稿告訴你的兩個不同的東西),將其推入已刪除的存儲桶列表,然後在新文檔(或已更新的文檔已移動)隨之而來,適合於這個空間。

確實,如果您對MongoDB在這個級別上的工作方式不太認真和理解,您可能會被迫定期運行repairDB以保持碎片之後的任何性能。

至於內存處理。正如我所說的,操作系統處理這個。當操作系統將釋放內存的一個很好的解釋是維基百科:http://en.wikipedia.org/wiki/Paging

直到有沒有足夠的內存來存儲所有需要的數據,獲得空頁幀的過程不​​涉及從RAM取出另一頁。

因此,操作系統將爲您處理刪除頁面,您不應該關注那個部分,而應該關注如何使您的工作集適合RAM。

如果您擔心存儲郵件並且並不真正想要,也就是說您希望它們被「刷新」,您實際上可以使用隨後的MongoDB安裝附帶的TTL功能:http://docs.mongodb.org/manual/tutorial/expire-data/這基本上允許您設置應該從集合中刪除消息的超時時間。

因此,如果設置正確的話,MongoDB可以像Facebook一樣進行消息傳遞和聊天,當然他們會使用XMPP協議,然後將消息歸檔到Cassandra進行搜索,但是您不必像他們那樣去做,這只是實現相同目標的一種方式。

希望這是有道理的,我沒有圍繞圈子,這是一個長的答案。

0

我們使用的混合設計,所以我們當我們需要精力充沛的表現,如消息,隊列和Redis的緩存it's,當我們需要尋找在二級指標或更新整個文檔中,我們使用MongoDB的。

您也可以嘗試Riak,它可以比MongoDB更線性平滑地增長。

相關問題