Rails有一组不错的过滤器(before_validation、before_create、after_save等)以及对观察者的支持,但我面临的情况是,依赖过滤器或观察者的计算成本太高。我需要一个替代方案。
问题是:我正在记录大量网页的web服务器点击量。我需要的是一个触发器,当一个给定的页面被浏览超过X次时,它将执行一个操作(例如,发送一封电子邮件)。由于大量的页面和点击,使用过滤器或观察者将导致大量的浪费时间,因为99%的时间,它测试的条件将是假的。该电子邮件不需要立即发送(即5-10分钟的延迟是可以接受的)。
相反,我正在考虑的是实现某种进程,每5分钟左右扫一次数据库,检查哪些页面被击中超过X次,记录在一个新的DB表中,然后发送相应的电子邮件。它不太优雅,但它会成功的。
还有其他人有更好的主意吗?
发布于 2009-05-22 22:52:09
耙的任务很好!但是您最终会为添加的每个后台作业编写更多的自定义代码。查看延迟的作业插件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)) )发布于 2009-05-23 15:53:14
我曾经是一个团队的一员,这个团队编写了一个定制的广告服务器,它具有相同的要求:监视每个文档的点击次数,并在它们达到某个阈值后做一些事情。这台服务器将为一个拥有大量流量的现有大型站点供电,而可伸缩性则是一个真正值得关注的问题。我的公司雇了两位Doubleclick顾问来挑选他们的大脑。
他们的观点是:保存任何信息的最快方法是将其写入自定义Apache日志指令中。因此,我们构建了一个站点,每当有人点击一个文档(广告、页面等)时,处理请求的服务器都会向日志中写入一条SQL语句:“插入到印象中(时间戳、页、ip等)值(x,'path/ to /doc',y,等等);-所有输出都动态地从we服务器输出数据。每隔5分钟,我们就会从web服务器上收集这些文件,然后一次将它们全部转储到主数据库中。然后,在我们空闲的时候,我们可以解析这些数据来做我们喜欢做的任何事情。
根据您的确切需求和部署设置,您可以执行类似的操作。与执行SQL以增加值或插入一行相比,检查是否超过某个阈值的计算要求可能更小(在这里猜测)。您可以通过记录命中(不管是否有特殊格式)来消除这两部分开销,然后定期收集它们,解析它们,将它们输入数据库,并对它们做任何您想做的事情。
发布于 2009-05-22 22:07:05
保存命中模型时,更新页面模型中的一个冗余列,该列存储正在运行的点击总数,这将花费您两个额外的查询,因此可能每次点击都需要两倍的时间来处理,但是您可以决定是否需要使用简单的if发送电子邮件。
你原来的解决方案也不错。
https://stackoverflow.com/questions/900171
复制相似问题