【问题标题】:Devise async not working with sidekiq (sending emails with Devise Mailer)设计异步无法与 sidekiq 一起使用(使用 Devise Mailer 发送电子邮件)
【发布时间】:2015-05-16 02:55:53
【问题描述】:

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

经过大量挖掘,与我所拥有的和 devise_async wiki 中的主要区别在于 devise_async.rb 文件缺少参数(不幸的是,这仍然不能解决问题)。

编辑

问题可能是我没有 sidekiq 工作人员——尽管 devise_async 文档没有谈到这一点。我是否需要触发将触发 UserMailer 的 sidekiq 工作人员?我的印象是 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

【问题讨论】:

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


    【解决方案1】:

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

    您应该尝试以下方法:

    1. 从 devise_async.rb 中删除 config.queue = :default。 (DeviseAsync 默认使用:mailer 队列)。
    2. 运行sidekiq -q default -q mailer

    除了 :default 队列中的任何其他作业之外,您的 sidekiq 工作人员现在将处理来自 :mailer 队列的设计电子邮件

    【讨论】:

    • 我实际上一直在使用 bundle exec sidekiq -C config/sidekiq.yml -q mailer 启动 sidekiq。我一删除-q mailer,它似乎就开始工作了。不知道为什么。
    • 当您运行sidekiq -q mailer 时,它将运行“邮件”队列中的所有作业。如果您省略-q mailer,那么sidekiq 将从“默认”队列运行作业。如果你想同时运行两个队列,你可以运行sidekiq -q default -q mailer
    【解决方案2】:

    我在处理 devise_async 时遇到了类似的问题。

    我找到并适合我的解决方案如下:

    用户.rb

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

    我已经替换为:

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

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

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-25
      • 1970-01-01
      • 2022-11-03
      • 2016-06-05
      相关资源
      最近更新 更多