【问题标题】:Sending email using sidekiq, redis使用sidekiq、redis发送邮件
【发布时间】:2017-08-17 07:34:22
【问题描述】:

我对 ruby​​ 中的 sidekiq 有疑问。 我正在构建一个系统来发送活动电子邮件,10k - 50k 电子邮件/活动。 现在我使用 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的例子?

【问题讨论】:

  • "任何加快我的系统的想法" - 是的。第一步是找出究竟慢的地方。只有这样你才能开始考虑改进它。
  • 是的,但实际上我真的不明白为什么它这么慢。我使用 sidekiq 的方式是否正确?
  • 你猜怎么着,我们也不[理解为什么你的应用这么慢]。
  • “我使用 sidekiq 的方式是否正确?” - 是的,sidekiq api 在这里的使用似乎很好。
  • @TungLe : 圈出问题所在 - 你的生产者慢吗,即你上面生成 EmailWorker 的代码慢吗?您的消费者慢吗?即消费者客户端是否运行得足以处理负载?每个工作进程是否需要太多时间才能完成?例如在 web ui 中监控。另外,请阅读 sidekiq 并发(权衡)。是第 3 方通话(比如 SES)让您放慢了速度吗?我能想到的只有几件事。

标签: ruby email redis sidekiq


【解决方案1】:

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

两者都不好:

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

怎么办?

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

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

【讨论】:

  • 感谢 Pavel 的详细回答,您对此有很多经验
  • 是的,我有:发送相同的广告很常见。向所有注册用户发送电子邮件。
猜你喜欢
  • 2018-01-29
  • 1970-01-01
  • 1970-01-01
  • 2016-08-11
  • 2014-08-16
  • 1970-01-01
  • 1970-01-01
  • 2013-03-31
  • 2013-11-26
相关资源
最近更新 更多