2013-07-29 30 views
1

我正在尋找關於監控特定表格的建議,該表格每天可以獲得大約250,000個插頁。雖然不是很大,但它正在迅速增長,我們無法像現在這樣繼續工作。RoR觀察頻繁更新的表格中的更改

主要應用程序依賴RoR4與MySQL數據庫。數據從多個radius服務器直接流入數據庫。

我們需要監控的特定列於一個特定的值,然後進行簡單的查找:

if column == xxx 
    venue = Venue.find_by(bar: foo) 
    if venue.is_monitored? 
    do some other shizzle 
    end 
end 

的位置表是一個平凡的大小也不,所以我不想看每次發生事情時都會通過數十萬行。

有人可以幫助推薦一種快速有效的方法來做到這一點?目前檢查每個插入在Rails中看起來很荒謬。我們也嘗試每隔60秒在後臺處理這項工作,但似乎過時了。

到目前爲止,最好的解決方案是觀察插入的值,將其發佈到Redis並使用節點服務器來監聽事件。然後推回到Rails。

對不起,如果這是主觀或偏離觀點,我真的很想有人教我一個美味的方式來做到這一點。

回答

1

如何將監控傳輸到MySQL?

您可以使用在您正在監視的表的UPDATE和INSERT上運行的TRIGGER。在同時插入創建到一個臨時表已更新備案/的ID,那麼一旦:此觸發器將進行驗證,如果條件滿足就可以:(多種可能性)

  • 拉路您的Rails應用程序可以從此臨時表中獲取ID,將其清空,然後對這些特定記錄執行所需的操作。
  • 推送方式:觸發器使用MySQL的sys_exec()來調用一個執行所需操作的ruby/rails腳本。

注意,你會陷入其中記錄僅獲得觸發執行後,只是你的Rails應用程序執行前修改的情況下,所以你應該有你的Rails應用也驗證所有條件都滿足於任何一種方式收到的記錄。

編輯

你必須精打細算。推動可能看起來很有吸引力,因爲它節省了資源,而且行動是立竿見影的,但MySQL觸發器會「開槍並忘記」。那麼,如果以某種方式sys_exec()無法訪問您的Rail腳本呢? (系統崩潰,無論如何),所以您的Rails應用程序可能不會收到記錄,也不會看到記錄。

拉是更安全的,因爲有關記錄的ID保存在臨時表中,並且如果有附加Rails將仍然能夠稍後找到它們。但行動延遲了幾秒鐘(這並不總是可以接受的情況),而且它更耗資源。

選擇是你的,取決於你的要求。

而且,如果你喜歡複雜的解決方案或者乾脆如果你需要在同一時間數據的安全性和立即採取行動,你可以同時實現解決方案的混合:

  1. 觸發保存記錄的ID在臨時表,並通過sys_exec()調用你的腳本。
  2. 通過sys_exec調用,Rails執行所需的操作,並從臨時表中刪除相應的記錄,因爲操作已完成,我們不再需要它了。
  3. 有一次,Rails檢查臨時表以確保沒有錯過任何記錄,並且如果臨時表中還有記錄,您仍然可以對其執行操作。

這涵蓋了一切:消耗更少的資源,立即響應,並恢復不可預知的情況。但它更難以實現

-

注:我用的是「臨時表」一詞,但我不是指在SQL詞彙就像一個內存表左右,最好是「暫時的」有一個真正的基於磁盤的表來保護它免受系統崩潰。

+0

我很快看了一下觸發器,並不確定他們是否比在Rails中運行cron更好。提取數據不是'實時',但我猜sys_exec方法可能工作。我將不得不調查Ruby腳本開銷。例如,每秒運行一次耙將會終止服務器。 – simonmorley

+0

編輯我的回答 – Benj

+0

在Redis中,我們使用了很多pub sub,並且仍然必須檢查表以防萬一錯過。你的想法聽起來不太複雜。在作出決定之前,必須閱讀觸發器。一直在尋找分析數據的起伏的數據日誌。非常喜歡這兩個概念...... – simonmorley