[英]Need alternative to filters/observers for Ruby on Rails project
Rails擁有一組不錯的過濾器(before_validation,before_create,after_save等)以及對觀察者的支持,但是我面臨着這樣一種情況,即依賴過濾器或觀察者在計算上過於昂貴。 我需要替代方法。
問題:我正在記錄Web服務器命中的大量頁面。 我需要的是一個觸發器,當給定的頁面被查看超過X次時,它將執行一個操作(例如,發送電子郵件)。 由於大量的頁面和點擊,使用過濾器或觀察器將導致大量時間浪費,因為在99%的時間中,它測試的條件都是錯誤的。 電子郵件不必馬上送出(即5-10分鍾的延遲是可以接受的)。
相反,我正在考慮的是實現某種過程,該過程每5分鍾左右掃描一次數據庫,並檢查哪些頁面被命中X次以上,將該狀態記錄在新的DB表中,然后發送相應的電子郵件。 它並不完全優雅,但可以使用。
還有其他人有更好的主意嗎?
耙子任務很好! 但是最終您將為添加的每個后台作業編寫更多的自定義代碼。 查看延遲作業插件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)) )
我曾經是一個編寫自定義廣告服務器的團隊的成員,該團隊具有相同的要求:監視每個文檔的點擊數,並在達到一定閾值時執行一些操作。 該服務器將為現有的非常大的站點提供大量流量,而可伸縮性是一個真正的問題。 我公司聘請了兩名Doubleclick顧問來絞盡腦汁。
他們的意見是:保留任何信息的最快方法是在自定義Apache log指令中編寫信息。 因此,我們建立了一個站點,每次有人點擊文檔(廣告,頁面,都一樣)時,處理請求的服務器就會在日志中寫入一條SQL語句:“ INSERT INTO印象(時間戳,頁面,ip等) )值(x,“ path / to / doc”,y等);“ -所有動態輸出與來自Web服務器的數據。 每隔5分鍾,我們將從Web服務器中收集這些文件,然后一次將其全部轉儲到master數據庫中。 然后,有空時,我們可以解析該數據以執行我們滿意的任何事情。
根據您的確切要求和部署設置,您可以執行類似的操作。 檢查您是否超過某個閾值的計算要求可能甚至比執行SQL增加值或插入行還要小(在此處猜測)。 您可以通過記錄命中(無論是否使用特殊格式)來消除開銷的這兩個方面,然后定期收集它們,對其進行解析,將它們輸入到數據庫中以及對它們進行任何所需的操作。
保存命中模型時,請更新頁面模型中存儲了連續命中總數的冗余列,這將使您多花2個查詢,因此每個命中的處理時間可能是原來的兩倍,但是您可以決定是否需要發送使用簡單的if電子郵件。
您原來的解決方案也不錯。
我必須在這里寫一些東西,以便stackoverflow代碼突出顯示第一行。
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
但是您經常希望它運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.