2011-06-14 107 views
6

我正在使用PHP和CodeIgniter構建聊天應用程序。使用memcached作爲聊天消息的數據庫緩衝區

爲此,我使用memcached實現緩存「緩衝區」,以將最近的聊天消息保存在內存中,從而減少數據庫的負載。我想這樣做是:

  1. 當消息到達時,我使用了當前分鐘(YYYY-MM-DD-HH-MM)爲重點,將其保存在memcached的。沒有涉及數據庫I/O。這個想法是,來自同一分鐘的所有消息都在同一個密鑰下收集。
  2. 用戶收到從memcached中獲取的新聊天消息(現在我使用長輪詢,但由於顯而易見的性能原因,這將移到Node.js下的WebSockets中)。同樣,沒有涉及數據庫I/O。
  3. 自動服務器腳本(cronjob)將每5分鐘運行一次,收集最近5分鐘的memcached數據並將消息插入數據庫。
  4. Memcached的對象設置6分鐘後去陳舊,所以我們從來沒有需要保持超過6分鐘值得的消息數據在內存中

這對於每5分鐘的總一個數據庫寫操作和零數據庫讀取操作。

這聽起來可行嗎?有沒有更好的(甚至可能是內置的)的方式來使用memcached達到這個目的?


更新:我一直在嘗試,現在一點點,我有一個快捷方式(閱讀:破解)的想法。我可以在Node.js服務器腳本中暫時緩衝消息,直到我準備好存儲它們。 Node.js服務器中的Javascript對象/消息數組基本上是一個內存緩存 - 種類。所以:每N條消息/秒,我可以使用任何我想要的方法將緩衝消息(JS數組的內容)傳遞到我的數據庫,因爲它不會經常被調用。

但是,我擔心這可能會削弱Node.js服務器進程,因爲它可能不會享受攜帶這個200 KB陣列。

對此策略有何看法?它完全瘋了嗎?

+0

需要研究的技術:COMET&erlang/jabber(Facebook使用這些)OR:HTML5和Web套接字(帶有閃存套接字後備 - 谷歌爲這些) – 2011-07-14 19:52:18

回答

2

爲什麼不使用INSERT DELAYED?它爲您提供了幾乎與不需要memcached一樣的功能。

無論如何,你的解決方案看起來也不錯。

+0

有趣的想法。我不太喜歡它的想法,因爲它似乎強迫喂SQL服務器,希望它能記住正確咀嚼(可擴展到每秒100個插入),但它實際上可能工作在 – 2011-06-14 21:41:25

+0

@Jens:這不是希望。INSERT DELAYED是專門針對這種情況製作的。 – dynamic 2011-06-14 21:42:33

+0

但是,如果我的node.js實例接收到100個消息/秒,並且它需要向每個SQL服務器發出INSERT DELAYED語句,是不是必須建立100個到數據庫服務器的連接?除非我可以使用node.dbslayer.js來完成連接池。 – 2011-06-14 22:10:57

3

你看過HTML5套接字連接嗎?使用套接字服務器,您不需要存儲任何內容。服務器接收來自一個用戶的消息,並立即將其發回給正確的用戶。我沒有用HTML5自己做過,但我知道現在存在的功能。在使用Flash之前,我已經完成了這個工作,它也支持套接字連接。

+1

WebSockets是目標,當然,但它們在大多數瀏覽器中尚不可用,所以現在我將使用Socket.IO(在可用時使用WebSockets,但有幾個後備機制) – 2011-06-14 21:31:52