设计异步不与sidekiq一起工作(使用Devise Mailer发送电子邮件)

时间:2015-03-13 14:54:26

标签: ruby-on-rails devise sidekiq devise-async

我正在尝试使用Devise :: Mailer一次发送多封电子邮件。使用Devise Async,我想将这些电子邮件排队,而不是通过完全发送它们来减慢整个系统的速度(可以将应用程序延迟大约20秒)。主要问题似乎是devise_async gem似乎根本没有与sidekiq通信(我在sidekiq日志中没有看到任何内容)。

经过多次挖掘后,与我所拥有的以及devise_async wiki中的内容的主要区别在于devise_async.rb文件缺少参数(遗憾的是,这仍然无法解决问题)。

修改

问题可能是我没有sidekiq工作者 - 虽然devise_async文档没有谈到这一点。我是否需要触发sidekiq worker然后触发UserMailer?我的印象是UserMailer本身就是一名工人。

devise_async.rb

Devise::Async.setup do |config|
  config.enabled = true
  config.backend = :sidekiq
  config.queue   = :default
end

sidekiq.yml

:verbose: true
:concurrency: 25
production:
  :concurrency: 20
:queues:
  - [mailer, 5]
  - [default, 5]

devise.rb

config.mailer_sender = 'test@gmail.com'
config.mailer = 'UserMailer'

user.rb

after_create :send_email_notification

devise :database_authenticatable, :registerable, :timeoutable,
         :recoverable, :rememberable, :trackable, :validatable, :async

def send_email_notification
        user = User.find(id)
        team = Team.find(user.team_id)

        team.memberships.each do |membership|         
            UserMailer.notification_email(user, team, membership).deliver_later
        end
    end

user_mailer.rb

class UserMailer < Devise::Mailer
    default from: "test@gmail.com"

    def notification_email(current_user, team, membership)
        @user = current_user
        if ENV["ENABLE_EMAIL"] == "YES"         
            if membership.user_id != current_user.id
                subject = 'TEST'
                @recipient_name = membership.user.userName.titleize
                mail(to: membership.user.email, subject: subject)
            end     
        end

    end
end

2 个答案:

答案 0 :(得分:1)

我遇到了类似的问题,其中DeviseAsync不尊重我使用Devise::Async.queue = :some_queue配置的自定义队列。

您应该尝试以下方法:

  1. 从devise_async.rb中删除config.queue = :default。 (默认情况下,DeviseAsync将使用:mailer队列。
  2. 运行sidekiq -q default -q mailer
  3. 除了:mailer队列中的任何其他作业

    之外,您的sidekiq工作人员现在将处理来自:default队列的Devise电子邮件

答案 1 :(得分:0)

我使用devise_async处理了类似的问题。

我找到并且对我有用的解决方案如下:

User.rb

UserMailer.notification_email(user, team, membership).deliver_later

我已替换为:

UserMailer.delay.notification_email(user, team, membership)

所以,我相信现在你可以运行:bundle exec sidekiq

我希望它可以帮到你