2009-05-22 40 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来增加一个值或插入一行相比可能还要更小(这里猜测)。您可以通过记录命中(特殊格式或不)来消除这两个开销,然后定期收集它们,解析它们,将它们输入到数据库,并根据需要执行任何操作。