首页 > 解决方案 > Sidekiq 延迟扩展没有为 *一些 * 工作生成电子邮件

问题描述

我有一个非常标准的 Rails Mailer,我正在使用Sidekiq 的 Delay Extension。我正在尝试发送大约 20,000 封电子邮件,其中大多数都可以正常工作,但大约 6000 封似乎根本不起作用。

在 Sidekiq 工作中,我遍历所有相关客户端并在每个客户端上调用延迟邮件程序:

campaign
  .clients
  .find_each do |client|
    CampaignMailer
      .delay
      .step(campaign_id, step, client.email, client.first_name)
  end

CampaignMailer#step非常通用,没有提前返回声明或任何明显的东西:

class CampaignMailer < ApplicationMailer

  def step(campaign_id, step_name, email, first_name)
    @campaign = Campaign.find(campaign_id)
    @events = @campaign.events.future
    ...

发送电子邮件时,生成复杂的 HTML 并通过 Postmark 发送大约需要1.5 秒

11084:2021-08-09T19:49:18.490Z 24735 TID-or8r5gewb Sidekiq::Extensions::DelayedMailer(---- !ruby/class 'CampaignMailer'- :step- - 1  - reminder_to_book  - xxx@example.com  - Name) JID-a3492a0743895c58de2891f7 INFO: start
11087:2021-08-09T19:49:19.988Z 24735 TID-or8r5gewb Sidekiq::Extensions::DelayedMailer(---- !ruby/class 'CampaignMailer'- :step- - 1  - reminder_to_book  - xxx@example.com  - Name) JID-a3492a0743895c58de2891f7 INFO: done: 1.498 sec

然而,这是另一个几乎相同的工作(只是电子邮件地址和名字不同),它在0.005 秒内运行并且没有产生电子邮件:

19247:2021-08-09T20:01:43.683Z 24735 TID-grkw8ptkj Sidekiq::Extensions::DelayedMailer(---- !ruby/class 'CampaignMailer'- :step- - 1  - reminder_to_book  - yyy@example.com  - Name) JID-72acbf511e6720dbec92d5bd INFO: start
19249:2021-08-09T20:01:43.688Z 24735 TID-grkw8ptkj Sidekiq::Extensions::DelayedMailer(---- !ruby/class 'CampaignMailer'- :step- - 1  - reminder_to_book  - yyy@example.com  - Name) JID-72acbf511e6720dbec92d5bd INFO: done: 0.005 sec

0.005 秒不足以做任何事情,甚至是数据库查找。似乎该工作在被捡起后立即被放弃。

当我稍后重新创建相同的作业时,电子邮件已成功发送。

他们正在运行“sidekiq-unique-jobs”扩展,该扩展设置为lock: :until_expired, lock_ttl: 1.hour, on_conflict: :log. 我知道这不会被触发,因为否则我们会得到如下日志语句:

2021-08-10T21:57:06.150Z 30264 TID-oxw249we0 SidekiqUniqueJobs::Client::Middleware DIG-uniquejobs:65cfc40dcae273c14282c749d1846b71 INFO: skipping job with id (06443737f9c2306dc927a962) because unique_digest: (uniquejobs:65cfc40dcae273c14282c749d1846b71) already exists

有谁知道它可能是什么?会不会是 Redis 负载,有 20,000 多个工作?是延迟扩展里面的东西吗?

标签: ruby-on-railsrubysidekiq

解决方案


推荐阅读