簡體   English   中英

需要替代Ruby on Rails項目的過濾器/觀察器的方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM