2012-12-21 26 views
4

我目前正在爲我與之合作的公司編寫一個小型的內部社交媒體平臺, 40,000多個用戶。它基本上就像Facebook或Google+,但功能較少。通知系統(電子郵件,社交媒體)

此平臺還有一個電子郵件通知系統(在線用戶的Ajax通知旁邊)。

現在這是我的問題 - 它根本不是縮放。

我有一個mySQL表,其中包含所有要發送的電子郵件通知。因此,只要有人在一個組中寫入一個故事,系統會自動在該表中插入一行,並且一個email_send函數(cronjob)會將這些郵件發送給用戶(用戶可以在即時,每日或每週通知郵件之間進行選擇)

到目前爲止,這麼好 - 如果組的成員數量較少。

但是現在用5k +成員圖像組 - 一旦用戶將一個故事發布到該組中,它就會觸發5,000個SQL插入到通知表中。

你會如何解決這個問題?我想到服務器上的後臺工作人員會掃描新的故事/評論/內容,並在後臺觸發email_send函數。這會擴大嗎?還是隻有一個標準的方式,我只是在錯誤的方向思考?

在正確的方向上的任何一點將是非常大加讚賞, 謝謝你,聖誕快樂:)

//馬庫斯。

+0

哇,你需要別的東西!這是行不通的!一次5000行,只有一個通知! –

+0

是的,這正是我想到的:)但是,責怪我,我只是盲目地看到正確的解決方案atm ... –

回答

3

您不應該通過發送電子郵件來減慢正常的Web請求/響應流程 - 只需將數據轉儲到隊列中並讓後臺作業接收該作品 - 聽起來您已經在使用cron執行此操作了吧?

那麼它是插入是慢的原因? 然後只需標準化您的數據,只需在您的電子郵件隊列表中插入一個groupID即可。該組ID與包含X用戶及其電子郵件地址的組相關聯。所以,那麼你將被插入1點的記錄,而不是5000 所以很快也許這樣的事情...

notificationTable 
rowID | emailID | groupID | status 

groupTable 
groupID | groupName 

userTable 
userID | userName | emailAddress | groupID 

如果你想利用它甚至進一步,那麼你可以引入一個消息系統,這樣就可以開火關閉簡單(和快速)消息,並且有一個或多個聽衆(在一個或多個單獨的服務器上)等待一個或多個頻道上的消息。

+0

沒錯。插入到通知表中的INSERTS減慢了在該5k +成員組中發佈新故事的過程。這就像你在發佈時有3-5秒的滯後。我想到了一些根本就沒有通知表的東西 - 就像一個cron工作,通過故事運行,並檢查它是否已經觸發了這個故事的電子郵件。這可以通過我已有的事件表(對於故事)來完成。但在我開始寫作之前,最好能從其他人面對同樣問題的一些想法。 –

+0

哦,你更新了你的答案 - 就像你讓我想到了正確的方向,+1並解決了 - 謝謝你! (請參閱以下我自己的答案,我如何解決它) –

0

好吧,我想出了以下(可能的)解決我的問題:

  • 我已經有一個表 「事件」:

rowID (event_id)| story_id | initiator | group_id

  • 創建一個新表「not_notified」:

rowID | event_id

只要有人張貼新的故事/註釋無論系統現在將插入一行到表「not_notified」。

cron作業每運行幾分鐘(如果速度出現問題,可以從另一臺專用服務器運行)並選擇「not_notified」表。它只是遍歷所有記錄集,並查找每個event_id,拉取故事,檢查通知用戶的通知設置,並向用戶發送電子郵件通知。 最後腳本刪除「not_notified」行。

我甚至可能不需要「not_notified」表 - 它可以在事件表一個簡單的「新」領域進行爲好,但數以百萬計的圖像在該表中的條目......

思考?