2016-06-10 30 views
1

我正在開發一個Rails 3.2應用程序,供用戶創建,讀取和更新多種報告。我們使用MySQL和Redis。當X記錄沒有在X時間內更新時通知用戶

我想通知用戶,當他們的報告之前的X個月沒有更新時,他們會在瀏覽器的個人資料頁/儀表板頁面上向他們顯示通知。

我寧願這樣做異步。

在某些時候,我還希望通過應用內通知進行實時通知,以便在用戶正在查看的報告已更新或某人喜歡他們的報告時通知用戶。從概念上講,我正在考慮要去這樣做是最好的方法......

  1. 運行的SQL查詢和檢索具有update_at超過3個月以上領域的所有報告,並創建一個鏈接的通知記錄中的cron作業該用戶和報告。只有當用戶沒有現有通知時,纔會創建新的通知記錄。

  2. 一個後臺作業,使用像Resque這樣的工具,在整個一天定期檢查數據庫。通知存儲在隊列中。這看起來好像可以更好地適應更強大的應用內通知功能。

這些是我唯一的兩個選擇嗎? 是否有更好的異步方式來偵聽數據庫,並在3個月內沒有更新其中一條記錄時通知用戶?是否需要在此實現一些websockets?

回答

0

我不相信你一定需要在某些總是運行的後臺作業中使用CPU週期,但這取決於你希望這些通知有多強大。如果你希望它們是實時的,並且你打算在將來使用發佈者訂戶模型,那麼我想consider a redis + node server setup.

websockets的複雜性意味着更多的實現時間。這段時間會花費你多長時間嗎?如果您的通知異步且實時,例如在聊天應用中交換消息或在Facebook上獲取彈出式通知,這非常重要,那麼這是正確的選擇。然而,如果你真正想要做的就是讓用戶知道他們的報告何時超過特定年齡,當他們請求他們的個人資料頁面時,每隔幾個小時運行一個cron將會更容易實現。您甚至可以使用Google Analytics(分析)瞭解用戶何時將最沉重的負擔投入到您的應用中,並圍繞此安排工作。

首先,創建一個rake任務,完成上述行爲 - 檢查舊報告並創建通知。將其放入您應用的lib/tasks目錄中。然後寫一個cron作業,像這樣:

$ 0 6,12,18 * * * cd /path/to/app && bundle exec rake task_name

此任務每天運行3次,早上6點,中午12點和下午6時。

從那裏,如果你想爲你的用戶創建一個activity feed,你也可以很簡單地實現一個同步的pub-sub解決方案。例如,用戶A訂閱用戶B的報告,用戶B發佈新報告,after_save回調爲用戶A創建通知。這會比較慢,不會實時,但如果它是一個小應用程序,作爲核心部分,那麼這會比其他選項更好地利用您的時間。

相關問題