Отправка электронной почты с помощью Sidekiq, Redis
У меня есть вопрос о sidekiq в ruby. Я создаю систему для отправки электронных писем кампании, 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?
1 ответ
Отправка электронных писем кампании - довольно стандартная задача - нужно отправить N писем (ваш N=10k..50k).
Новички выбирают два противоположных способа: одно фоновое задание с N-циклом ИЛИ N фоновых заданий с одной отправкой.
Оба плохие
- Длинный N-цикл уязвим для ошибок и принудительного завершения работы (развертывание приложения и т. Д.) - много сообщений может быть отправлено дважды, а многие могут быть потеряны.
- N-заданий занимает много времени из-за накладных расходов на обработку заданий (ваш случай).
Что делать?
Порции. Используйте M заданий с K-петлей каждый, где M*K=N. Пример: 100+ заданий с 100 циклами для каждого случая. Попробуйте разные M, K и выберите лучший для вас. Это не серебряная пуля, а золотая середина плохих противоположных путей.
Услуги отправки электронной почты. Если ваша кампания является маркетингом электронных писем(я думаю, что это так), лучшим способом является использование служб отправки электронной почты, таких как Sendgrid, SES, Mailchimp, Mailgun, Elasticemail и так далее.
Они позволяют создать шаблон электронной почты (с подстановками) для каждой кампании, а затем выполнить отправку всей кампании всего одним вызовом API (с адресами и подстановками в качестве параметров вызова). Это самый быстрый и надежный способ, кроме того, услуги отправки электронной почты предоставляют дополнительные преимущества. Единственный недостаток - это платно.