2009-05-22 38 views
0

的Rails替代的Ruby過濾器/觀察家有一個很好的組過濾器(before_validation,before_create,after_save的,等等),以及觀察員的支持,但我面對的其中依靠的情況過濾器或觀察者的計算成本太高。我需要一個替代品。需要on Rails項目

的問題:我登錄的Web服務器命中大量的頁面。我需要的是一個觸發器,當給定的頁面被查看超過X次時,它將執行一個動作(比如發送一封電子郵件)。由於大量的頁面和命中,使用過濾器或觀察者將導致大量浪費時間,因爲在99%的時間內,它測試的條件將是錯誤的。電子郵件不是必須立即發送(即5-10分鐘的延遲是可以接受的)。

我正在考慮的是實現某種過程,每隔5分鐘左右掃描一次數據庫,並檢查哪些頁面被命中超過X次,將該狀態記錄在新的數據庫表中,然後發送出相應的電子郵件。它不完美,但它會工作。

其他人有更好的主意嗎?

+0

我不想發佈這個作爲答案,因爲我沒有徹底研究過它,但谷歌搜索'rails cron'進入你的問題域?如果是這樣,我敢打賭你的問題可能更具體。 – 2009-05-22 22:08:39

+0

我知道!只有當它是真的時才測試條件,這樣可以節省99%的處理時間。 :D – 2009-05-22 22:09:39

回答

0

當保存你的命中模型,更新您的頁面模型存儲運行的總點擊數的冗餘列,這會花費你2次額外的查詢,所以也許每個命中花費兩倍的時間來處理,但如果你可以決定需要用簡單的方式發送電子郵件。

您的原始解決方案也不錯。

0

我要在這裏寫的東西讓計算器代碼突出了第一線。

class ApplicationController < ActionController::Base 
    before_filter :increment_fancy_counter 

    private 

    def increment_fancy_counter 
    # somehow increment the counter here 
    end 
end 

# lib/tasks/fancy_counter.rake 
namespace :fancy_counter do 
    task :process do 
    # somehow process the counter here 
    end 
end 

有一個cron作業運行rake fancy_counter:process但是通常你希望它運行。

+0

我沒有考慮把它變成耙子:任務。謝謝! – 2009-05-22 22:26:09

1

Rake任務很好!但是你最終會爲你添加的每個後臺作業寫更多的自定義代碼。退房延遲招聘插件http://blog.leetsoft.com/2008/2/17/delayed-job-dj

DJ是依賴於一個簡單的數據庫表中的異步優先級隊列。根據DJ網站,您可以使用Delayed :: Job.enqueue()方法創建一個工作如下所示。

class NewsletterJob < Struct.new(:text, :emails) 
    def perform 
    emails.each { |e| NewsletterMailer.deliver_text_to_email(text, e) } 
    end  
end 

Delayed::Job.enqueue(NewsletterJob.new("blah blah", Customers.find(:all).collect(&:email))) 
1

我曾經是一個團隊寫了一個定製的廣告服務器,它具有相同要求的一部分:監控每個文檔的點擊次數,並做一些事情,一旦他們達到一定的閾值。這臺服務器將爲現有的大流量網站提供動力,而可擴展性是一個真正令人擔憂的問題。我的公司聘請了兩位Doubleclick顧問來挑選他們的大腦。

他們的意見是:堅持任何信息的最快方法是把它寫在自定義Apache日誌指令。因此,我們建立了一個網站,每次有人碰到文檔(廣告,頁面,都是這樣),處理請求的服務器會向日志中寫入一條SQL語句:「INSERT INTO impressions(時間戳,頁面,ip等) )VALUES(x,'path/to/doc',y等);「 - 所有動態輸出都來自網絡服務器的數據。每隔5分鐘,我們會從Web服務器收集這些文件,然後將它們全部一次轉儲到主數據庫中。然後,在我們的閒暇時間,我們可以解析這些數據,以便做出令我們滿意的任何事情。

根據您的具體要求和部署設置,您可以做類似的事情。檢查你是否超過某個閾值的計算要求與執行SQL來增加一個值或插入一行相比可能還要更小(這裏猜測)。您可以通過記錄命中(特殊格式或不)來消除這兩個開銷,然後定期收集它們,解析它們,將它們輸入到數據庫,並根據需要執行任何操作。