2011-09-27 51 views
2

我正在嘗試做一些像Facebook,與socket.io 0.6和tornadio流。實時Socket.IO縮放問題 - python

每個用戶在他的牆上都有自己的彗星通道/組。 我向所有朋友的牆上發送彗星消息(即使他們不在線)。

問題是關於縮放:如果我有100萬個朋友呢?在所有的牆壁上寫字需要很長的時間。

有沒有解決方案更有效地使用彗星做到這一點?

回答

2

這是社會空間中的一個難題。有兩種方法之間的權衡:

  • :當用戶產生的事件(如狀態更新),你把那個狀態更新到每個用戶的朋友的流。當用戶加載他或她的流時,您只需從一個地方讀取記錄。
  • pull:當用戶產生一個事件時,你甚至可以寫入用戶的數據記錄。當用戶加載他的流時,您會輪詢他的每個朋友的數據記錄,並即時彙總結果。

當用戶更新和用戶的「扇出」(例如,用戶擁有的最大關注者數量)較低時,加載流時推送方法很好。當用戶加載他的流很少,或者用戶可以遵循的用戶數量很少時,拉動方法是很好的。

我與人合着了paper關於如何有效地做到這一點。基本上,我們使用混合方法,根據用戶統計信息確定何時推送或拉取。

爲了簡單起見,我建議您實施拉模型。緩存聚合結果並僅在緩存條目陳舊一段時間後刷新用戶的提要。

+0

我們已經開發了用於第一次進入該頁面時的情況。我們需要對實時更新進行有效推送(這樣用戶不需要刷新頁面)。 –

+0

你只推送給當前登錄並激活的用戶嗎?如果您只推送給這些用戶,您是否仍然存在可擴展性問題? – jterrace

+0

事實上,這不是一種選擇,因爲寫給我所有的朋友需要很長時間,如果我必須驗證我的100萬朋友是否已登錄並激活,則需要很長時間。 –