Temos uma categoria #Announcements na qual todos os nossos membros são automaticamente inscritos para acompanhar a primeira postagem.
Isso nos permite agendar a publicação de posts nessa categoria em horários/datas definidos.
Por sua vez, o anúncio é enviado por e-mail para cerca de 25 mil membros.
O problema que enfrentamos é que os e-mails levam mais de uma hora para serem enviados, o que não é ideal para anúncios críticos em termos de tempo.
Se eu observar o Sidekiq, posso ver o contador “Scheduled” acumulando todos os e-mails individuais, um por um. Quando chega a cerca de 20.000, ele os move para a aba “Enqueued” e, eventualmente, eles começam a ser enviados.
Posso acelerar esse processo de alguma forma?
Para e-mails críticos em termos de tempo, seria bom enviá-los cerca de 100 vezes mais rápido do que atualmente
atraso enquanto os trabalhos de e-mail são enfileirados
tempo de processamento para o envio do e-mail real
Para o primeiro, não tenho 100% de certeza sobre isso, mas acho que diminuir email_time_window_mins significa que as notificações são enfileiradas mais cedo.
Uma vez que os trabalhos de e-mail são agendados, seus workers do sidekiq estão trabalhando neles um de cada vez. Aumentar os workers do sidekiq (definir DISCOURSE_SIDEKIQ_WORKERS de 5 para 10, 15 ou 20, dependendo da capacidade do servidor) significa que mais trabalhos são processados ao mesmo tempo, então a fila é esvaziada 2x/3x/4x mais rápido.
Não sei como o backend funciona em todos os detalhes, mas o email_time_window_mins é apenas uma configuração de atraso antes que o primeiro e-mail seja enviado. Durante esse tempo, qualquer usuário definido para receber o e-mail pode “desistir” do e-mail se estiver ativo dentro da janela de período (terminologia oficial: e-mail pulado; motivo do pulo: Usuário foi visto recentemente).
O atraso padrão é de 10 minutos, o que significa que a postagem deve estar ativa por 10 minutos, e só então os e-mails serão enviados.
O problema de Richie é a diferença de tempo entre o primeiro e-mail e o último e-mail… um atraso de uma hora. Isso provavelmente se deve à grande quantidade de e-mails que precisam ser enviados, embora eu também não possa ter certeza.
Alterar a configuração acima apenas aceleraria o envio do primeiro e-mail, mas não resolveria a duração de conclusão do lote inteiro de 22.000 e-mails.
Qual seria a configuração recomendada, obviamente dependente da capacidade da infraestrutura?
Uma configuração alta poderia resultar em problemas de servidor em termos de carga ou outros?
Depende 100% da capacidade do servidor do OP - muitos e isso vai desacelerar, poucos e levará mais tempo para processar.
Dado que o gráfico da CPU atingiu 40% (isso é de uma única CPU ou da capacidade total?), eu provavelmente começaria aumentando 2x (conservador) ou 3x (agressivo) e veria o que acontece, dependendo da tolerância ao risco de lentidão.
Alguém é capaz de confirmar se esta é a alteração correta a ser feita no meu app.yml quando o parâmetro DISCOURSE_SIDEKIQ_WORKERS não existe atualmente?
env:
LANG: en_US.UTF-8
# DISCOURSE_DEFAULT_LOCALE: en
## Quantas requisições web concorrentes são suportadas? Depende da memória e dos núcleos da CPU.
## será definido automaticamente pelo bootstrap com base nas CPUs detectadas, ou você pode substituir
UNICORN_WORKERS: 8
## Adicionada esta linha em 04/10/25
## REF: https://meta.discourse.org/t/is-there-a-way-i-can-send-email-notifications-faster/383103/12
DISCOURSE_SIDEKIQ_WORKERS: 7
Vou reconstruir mais tarde esta semana e cronometrar o envio de e-mails
Só para eu saber que minha alteração teve efeito, estou pensando corretamente que este valor Threads deve aumentar de 5 para 7?
Ele não se limita por si só, mas cada worker do sidekiq processará um trabalho por vez, então se você tiver 22.000 e-mails esperando para serem enviados, sete deles serão processados ao mesmo tempo.
Do lado ridículo das coisas, o servidor provavelmente não conseguirá acompanhar se você definir o número para 1.000 workers paralelos. Portanto, trata-se de encontrar um número que atenda a todas as suas necessidades:
processar o máximo de trabalhos possível ao mesmo tempo para concluir os 22.000 e-mails mais rapidamente
mas não consumir TODOS os recursos do servidor, o que não deixaria nenhum para os usuários do site