使用sidekiq、redis发送邮件

Sending email using sidekiq, redis

我对 ruby 中的 sidekiq 有疑问。 我正在构建一个系统来发送活动电子邮件,10k - 50k emails/campaign。 现在我正在使用 Redis 和 Sidekiq,我为每封电子邮件创建一个工作人员,如下所示:

receivers.each do |receiver|
    begin
      email_sending_log = EmailSendingLog.create(email: 
        receiver["email"], sender: sender["email"], content: 
        content["value"], status: "REQUESTED")
        EmailWorker.perform_async(adapter, receiver, sender, content, subject, email_sending_log.id.to_s)
    rescue Exception => e
    end
end

但是太慢了, 你们有什么想法可以加快我的系统吗? 或者一些加速 sidekiq、redis 的例子?

发送活动电子邮件是一项非常标准的任务 - 必须发送 N 封电子邮件(您的 N=10k..50k)。
初学者选择两种相反的方式:一个带有 N-loop 的后台作业或一个发送的 N 个后台作业。

两者都不好:

  • 长 N 循环容易出错并强制关闭(app deploy 等)- 很多消息可能会发送两次,很多消息可能会丢失。
  • 由于作业处理开销(您的情况),N 个作业需要花费大量时间。

怎么办?

批次。使用 M 个作业和 K 循环,每个作业 M*K=N。示例:100 多个作业,每个作业有 100 个循环。尝试不同的 M、K,然后选择最适合您的。这不是灵丹妙药,而是反其道而行之的中庸之道。

电子邮件发送服务。如果您的广告系列是marketing emails(我认为是),最好的方法是使用 Sendgrid、SES、Mailchimp 等电子邮件发送服务, Mailgun, Elasticemail 等等。
它们允许您为每个活动创建电子邮件模板(带替换),然后通过一个 API 调用(地址和替换作为调用的参数)发送整个活动。这是最快和最可靠的方式,而且电子邮件发送服务提供额外的好处。唯一的缺点是要付费。