2009-04-17 25 views

回答

37

許多社交網站如Twitter的不除了Message Queue應用程序外,完全可以使用RDBMS。他們中的很多人開始使用像RabbitMQ這樣的應用程序。他們中的一些人足夠大,他們必須大量定製或建立自己的。 Twitter正在進行第二次這樣做。

消息隊列應用程序通過爲一個或多個其他服務保存來自一個服務的消息來工作。比如說服務Frank將消息發佈到隊列foo。 Joe和Jill訂閱了Franks foo隊列。應用程序將跟蹤Joe或Jill是否收到消息,並且一旦隊列中的每個訂戶都收到它丟棄的消息。弗蘭克發出消息並忘記它。 Joe和Jill要求foo發送消息並獲取他們還沒有收到的消息。喬和吉爾做了他們需要處理的信息。也許保持它可能不是。

消息隊列應用保證大家誰應該能得到消息,當他們要求他們將得到的消息。發佈者可以發送消息確信訂戶可以最終獲得它們。這具有完全異步的優點,並且不需要昂貴的連接。

編輯:我還要提到的是,通常這些高規模的存儲都是非常規範化的。所以喬和吉爾可能會存儲完全相同的消息的副本。這被認爲是可行的,因爲它可以幫助應用擴展到數十億用戶。

其他閱讀:

  1. http://www.rabbitmq.com/
  2. http://qpid.apache.org/
+1

+1提的非正規化,這是不是對舊的SQL工作很明顯ld在那裏3NF長期以來一直是引導性的明星。 (http://en.wikipedia.org/wiki/Third_normal_form) – Crypth 2013-09-26 07:21:35

0

對於小規模上做users.friends和users.events和查詢高速緩存的加入可能是罰款,但不會很快作爲朋友和事件增長放緩。您還可以嘗試基於事件的模型,其中每次用戶創建一個事件時,都會在連接表中創建一個條目(可能稱爲「friends_events」)。因此,無論何時用戶想要查看他們的朋友創建的事件,他們都可以簡單地在他們自己的id和friends_events表之間進行連接並查找。通過這種方式,您可以避免與朋友一起抓住所有用戶,然後通過事件表加入他們的朋友。

7

社交網站的支柱數據結構是graph。在臉書上,圖表是無向的(當你是某人的朋友時,他們是你的朋友)。在Twitter上,圖表是直接的(你跟隨某人,但他們不一定跟隨你)。

兩個流行的方式來表示圖是adjacency listsadjacency matrices

鄰接列表只是圖中邊緣的列表。考慮具有整數用戶標識的用戶。

User1, User2 
    1  2 
    1  3 
    2  3 

這些記錄的無向的解釋是,用戶1是朋友,用戶2和3的用戶2也與朋友用戶3

在數據庫表中代表這是微不足道的。它是我們熟悉的多對多關係連接表。 SQL查詢來查找特定用戶的朋友很容易編寫。

既然您瞭解特定用戶的朋友,您只需將這些結果加入更新表。該表包含用戶ID索引的所有用戶更新。

只要所有這些表都正確的索引,你有一個非常簡單的時間設計高效的查詢來回答你感興趣的問題。