Y a-t-il un moyen d'envoyer des notifications par e-mail plus rapidement ?

Nous avons une catégorie #Announcements dans laquelle tous nos membres sont automatiquement abonnés pour suivre le premier message.

Cela nous permet de planifier la publication de messages dans cette catégorie à des heures/dates définies.

À son tour, l’annonce est ensuite envoyée par e-mail à environ 25 000 membres.

Le problème que nous rencontrons est que les e-mails mettent plus d’une heure à être envoyés, ce qui n’est pas idéal pour les annonces critiques en termes de temps.

Si je surveille Sidekiq, je peux voir le compteur « Scheduled » accumuler tous les e-mails individuels un par un. Une fois qu’il atteint environ 20 000, il les déplace vers l’onglet « Enqueued », puis ils commencent finalement à être envoyés.

Puis-je accélérer ce processus ? :thinking:

Pour les e-mails critiques en termes de temps, ce serait bien de les envoyer environ 100 fois plus vite qu’ils ne le font actuellement :blush:

Cette discussion pourrait vous aider, car elle explique comment définir DISCOURSE_MAX_DIGESTS_ENQUEUED_PER_30_MINS_PER_SITE, qui définit la limite globale pour les résumés.

2 « J'aime »

Je l’ai chronométré ce soir.

J’ai programmé un article à publier dans la catégorie #Announcements à 18h30.


À 18h40, il y avait 15 000 e-mails dans la file d’attente Scheduled.


À 18h45, soit 15 minutes après la publication, il y avait 22 000 e-mails dans la file d’attente Scheduled.


À 18h48, ces e-mails ont progressivement commencé à être déplacés vers la file d’attente Enqueued :


À 18h51, ils étaient toujours en cours de transfert :


À 19h03, les e-mails étaient en cours d’envoi :


À 19h10, il ne restait que 10 000 e-mails :


À 19h27, il ne restait que 569 e-mails :


Et à 19h29, tous les e-mails avaient été envoyés :


Voilà donc, une heure complète pour envoyer 22 000 notifications par e-mail.

Quelqu’un peut-il m’aider à identifier le goulot d’étranglement ici ?

J’aimerais beaucoup pouvoir envoyer ces e-mails plus rapidement que leur taux actuel de 22 000 par heure.

En parlant sans réfléchir,
Est-il possible que ce soit un problème de charge d’infrastructure ?

1 « J'aime »

Peut-être ?

Je ne sais vraiment pas :person_shrugging:
Le CPU a atteint environ 44 % sur le serveur :

Et j’utilise AWS SES pour le SMTP.

Il y a deux choses qui se passent ici :

  • délai pendant que les tâches d’e-mail sont mises en file d’attente
  • temps de traitement pour l’envoi de l’e-mail réel

Pour la première, je ne suis pas sûr à 100 % mais je pense que réduire email_time_window_mins signifie que les notifications sont mises en file d’attente plus tôt.

Une fois que les tâches d’e-mail sont planifiées, vos workers sidekiq les traitent une par une. Augmenter le nombre de workers sidekiq (définir DISCOURSE_SIDEKIQ_WORKERS de 5 à 10, 15 ou 20 selon la capacité du serveur) signifie que plus de tâches sont traitées en même temps, de sorte que la file d’attente est vidée 2x/3x/4x plus rapidement.

4 « J'aime »

Je ne connais pas le fonctionnement du backend dans les moindres détails, mais email_time_window_mins est juste un réglage de délai avant que le premier e-mail ne soit envoyé. Pendant ce temps, tout utilisateur défini pour recevoir l’e-mail peut “renoncer” à l’e-mail s’il est actif pendant la fenêtre de période (terminologie officielle : e-mail ignoré ; raison de l’ignorance : L’utilisateur a été vu récemment).

Le délai par défaut est de 10 minutes, ce qui signifie que le message doit être publié pendant 10 minutes, et seulement ensuite les e-mails seront envoyés.

Le problème de Richie est la différence de temps entre le premier e-mail et le dernier e-mail… un délai d’une heure. C’est probablement dû à la grande quantité d’e-mails à envoyer, bien que je ne puisse pas non plus le dire avec certitude.

Changer le réglage ci-dessus ne ferait qu’accélérer l’envoi du premier e-mail, mais n’aborderait pas la durée d’achèvement du lot entier de 22 000 e-mails.


Quel serait le réglage recommandé, évidemment dépendant de la capacité de l’infrastructure ?

Un réglage élevé pourrait-il entraîner des problèmes de serveur en termes de charge ou autres ?

1 « J'aime »

« Autant que le serveur peut en gérer ».

Cela dépend à 100 % de la capacité du serveur de l’OP : trop nombreux et cela ralentira les choses, trop peu et cela prendra plus de temps à traiter.

Étant donné que le graphique du processeur atteint 40 % (est-ce d’un seul processeur ou de la capacité totale ?), je commencerais probablement par augmenter soit de 2 × (conservateur), soit de 3 × (agressif) et je verrais ce qui se passe, en fonction de la tolérance au risque de ralentissement.

1 « J'aime »

Excellente analyse, merci :slight_smile:

Ce DISCOURSE_SIDEKIQ_WORKERS doit-il être un multiple de 5 ? Puis-je le régler sur 7 par exemple ?

Je n’ai pas ce paramètre dans mon app.yml, donc je suppose qu’il est réglé par défaut sur 5 quelque part.

Puis-je simplement créer ce paramètre sous le réglage existant des workers unicorn, puis reconstruire ?

Par exemple :

expose:
  - "443:443"

env:
  UNICORN_WORKERS: 8
  DISCOURSE_SIDEKIQ_WORKERS: 7

Est-ce aussi simple que cela ? :thinking:

Quelqu’un peut-il confirmer que c’est le changement correct à apporter à mon app.yml lorsque le paramètre DISCOURSE_SIDEKIQ_WORKERS n’existe pas actuellement ?

1 « J'aime »

Je crois que oui, après une brève demande au bot IA.

1 « J'aime »

Merci @TempAccount

Fait intéressant, DISCOURSE_SIDEKIQ_WORKERS n’apparaît que onze fois sur l’ensemble de meta :

Search results for '"DISCOURSE_SIDEKIQ_WORKERS" order%3' - Discourse Meta বৈশিষ্ট্য_topic

… et l’une d’elles est dans ce sujet :flushed_face:

Oui, c’est correct.

Toute (la plupart des ?) configuration peut être remplacée de cette manière. La valeur par défaut provient de discourse_defaults.conf.

2 « J'aime »

Merci @supermathie

Mon app.yml se lit maintenant comme suit :

env:
  LANG: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  ## Combien de requêtes web simultanées sont prises en charge ? Dépend de la mémoire et des cœurs de processeur.
  ## sera défini automatiquement par le bootstrap en fonction des CPU détectés, ou vous pouvez le remplacer
  UNICORN_WORKERS: 8

  ## Ajouté cette ligne le 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

Je reconstruirai plus tard dans la semaine et chronométrerai l’envoi des e-mails :smiley:

Juste pour savoir si mon changement a pris effet, est-ce que je pense correctement que cette valeur Threads devrait passer de 5 à 7 ?

2 « J'aime »

Oui, confirmé :

2 « J'aime »

@Richie avez-vous pu résoudre votre problème ?

Merci pour votre suivi.

Non, hélas non.

J’ai augmenté le nombre de threads de 5 à 8, mais les e-mails prennent toujours près d’une heure pour être envoyés du début à la fin.

Je m’attendrais à une augmentation d’environ 40 % du débit total.

Lorsque les tâches sont mises en file d’attente, observez-vous une utilisation de 7/7 ?

Regardez également la charge du serveur lorsqu’il les traite, et si vous pouvez l’augmenter davantage, je vous le recommande.

Ohhhhhh attends une minute. Est-ce que Discourse se limite d’une manière ou d’une autre ?

Ai-je manqué un réglage qui restreint son utilisation du CPU ?? :scream:

Il ne se limite pas en soi, mais chaque worker sidekiq traitera une tâche à la fois. Ainsi, si vous avez 22 000 e-mails en attente, sept d’entre eux seront traités simultanément.

Pour être plus précis, le serveur ne pourra probablement pas suivre si vous définissez le nombre à 1000 workers parallèles. Il s’agit donc de trouver un nombre qui convienne à tous vos besoins :

  • traiter autant de tâches que possible en même temps pour traiter les 22 000 e-mails plus rapidement
  • mais ne pas utiliser TOUTES les ressources du serveur, ce qui n’en laisserait aucune pour les utilisateurs du site
2 « J'aime »