Rails 4 - 邮件程序 deliver_later 没有按照我的预期进行,阻止了 UI
Rails 4 - Mailer deliver_later not doing what I expect, blocks the UI
我有一个 rails 应用程序,其中有一个功能可以发送很多电子邮件。我想这样做 asynchronously
并且我认为 deliver_later
方法可以做到这一点。目前,从用户单击 submit
到提交表单之间存在一些延迟 - 这会导致糟糕的用户体验(这是一个非常简单的表单)。我的实现如下所示:
def create
respond_to do |format|
if @competition.save
[...]
send_notification_to_team_members
end
end
def send_notification_to_team_members
@team.members.each do |member|
unless member.user.eql?(current_user)
Mailer.deliver_new_competition_notification(member.user, @competition).deliver_later
end
end
end
目前完成该操作需要 ~ 4 秒。我也试过:
Mailer.deliver_new_competition_notification(member.user, @competition).deliver_later(wait: 1.minute)
然后它需要更长的时间 - 我估计大约 1 分钟。
所以,我是在错误地使用 deliver_later
,还是方法没有达到我的预期。在那种情况下,我可以使用另一种方法来提高我的表现吗?
deliver_later
使用 ActiveJob 提供异步执行。
但是 ActiveJob 本身并不提供异步性 - 它是一个统一的 api 层,可以由许多后端实现。默认的只是内联运行所有内容,它不是异步的。
要获得异步使用,您需要选择一个异步后端。您可以在应用程序的配置中配置后端
config.active_job.queue_adapter = ...
通常大多数适配器都需要相应的 gem(例如 delayed_job、sidekiq、sucker_punch),它们也可能有自己的依赖项(例如 sidekiq 要求您使用 redis。
我有一个 rails 应用程序,其中有一个功能可以发送很多电子邮件。我想这样做 asynchronously
并且我认为 deliver_later
方法可以做到这一点。目前,从用户单击 submit
到提交表单之间存在一些延迟 - 这会导致糟糕的用户体验(这是一个非常简单的表单)。我的实现如下所示:
def create
respond_to do |format|
if @competition.save
[...]
send_notification_to_team_members
end
end
def send_notification_to_team_members
@team.members.each do |member|
unless member.user.eql?(current_user)
Mailer.deliver_new_competition_notification(member.user, @competition).deliver_later
end
end
end
目前完成该操作需要 ~ 4 秒。我也试过:
Mailer.deliver_new_competition_notification(member.user, @competition).deliver_later(wait: 1.minute)
然后它需要更长的时间 - 我估计大约 1 分钟。
所以,我是在错误地使用 deliver_later
,还是方法没有达到我的预期。在那种情况下,我可以使用另一种方法来提高我的表现吗?
deliver_later
使用 ActiveJob 提供异步执行。
但是 ActiveJob 本身并不提供异步性 - 它是一个统一的 api 层,可以由许多后端实现。默认的只是内联运行所有内容,它不是异步的。
要获得异步使用,您需要选择一个异步后端。您可以在应用程序的配置中配置后端
config.active_job.queue_adapter = ...
通常大多数适配器都需要相应的 gem(例如 delayed_job、sidekiq、sucker_punch),它们也可能有自己的依赖项(例如 sidekiq 要求您使用 redis。