【问题标题】:Is there anything similar to delayed_job, but without workers?有没有类似于delayed_job,但没有工人的东西?
【发布时间】:2011-10-11 07:40:37
【问题描述】:

在我的应用中,当用户注册时,他们会收到一封确认电子邮件。我使用delayed_job,使发送电子邮件的过程在后台进行。

但是使用delayed_job 的缺点是一直有一个工人。而且为此请一名工人是很昂贵的。

除了delayed_job 之外,还有什么东西可以让电子邮件发送进入后台。

这是我的控制器代码 sn-p。

def create
    @user = User.new(params[:user])

    respond_to do |format|
      if @user.save
        UserMailer.delay.registration_confirmation(@user)
        format.html { redirect_to @user, notice: 'User was successfully created.' }
        format.js

关键是我一天有 20-40 个注册。这意味着队列最多忙了大约 60 秒,而我将不得不支付一整天的费用,这是非常不切实际的。其他一些不错的方法。

【问题讨论】:

标签: ruby-on-rails-3 delayed-job


【解决方案1】:

我建议设置一个每小时运行一次并发送电子邮件的 cron。您必须创建一个新模型,QueuedEmail 或类似的东西,然后不要立即使用 ActionMailer,而是将其另存为 QueuedEmail。这与delayed_job 所做的基本相同,但您可以更好地控制它何时运行,并且crons 不会占用太多内存。

cron 应该是 script/rails runner,你应该在你的 QueuedEmail 模型中有一个方法,它将发送所有待处理的电子邮件。我推荐whenever 来生成 crontabs(快速设置并且非常易于使用)。 cron 看起来像这样(这个例子被设置为每天凌晨 2 点运行一次,你可以查看如何调整间隔,我不知道我的头上):

0 2 * * * /bin/bash -l -c 'cd /RAILS_ROOT/ && script/rails runner -e production '\''QueuedEmail.send_pending'\'' >> log/cron.log 2>&1'

或者在任何时候:

every :day, :at => '2 am' do
    runner "QueuedEmail.send_pending"
end

QueuedEmail#send_pending

class QueuedEmail < ActiveRecord::Base
    def send_pending
        all.each do |email|
            params = your_parsing_method(email.params)
            record = your_parsing_method(email.record)
            email.destroy if UserMailer.registration_confirmation(record, params).deliver
        end
    end
end

UserController#create

if @user = User.create(params[:user])
    User.delay_email(@user, params[:user])
    redirect_to user_path(@user), :notice => "Created User. E-mail will be sent within the hour."
end

用户#delay_email

def delay_email(record, params)
    QueuedEmail.create(:record => your_db_formatting_method(record), :params => your_db_formatting_method(params.to_s)) # or use something built in, like to_s.
end

这些代码都没有经过测试,可能已经完全损坏,但重要的是总体思路。您还可以更进一步,扩展 Rails ActionMailer,但这要先进得多。

【讨论】:

  • 想要一个 cron,它再次要求 heroku 有一个工人。我不想要一个单独的工人,但除此之外,我真的很喜欢你的方法
  • Heroku,提供免费的 cron 选项,这可能是目前最便宜的解决方案。
【解决方案2】:

如果您只使用一份工作来发送“注册邮件”,您最好不要为此使用单独的工作(考虑到您要发送的电子邮件数量非常少)。

这将简化您的配置并降低您的成本。

如果您的任务需要很长时间才能完成,或者您的网站非常繁忙,那么单独的工作很有用,因为两者都不是,最好只发送常规电子邮件。

【讨论】:

    猜你喜欢
    • 2016-03-16
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多