9
votes

Envoi de courrier électronique SMTP à un taux élevé de .NET

J'ai un service .NET qui traite une file d'attente sur un fil d'arrière-plan et des éléments de la file d'attente envoie un grand nombre de petits messages électroniques à un taux très élevé (disons 100 messages par seconde si cela est même possible). Actuellement, j'utilise smtpclient.send () < / code> mais j'ai bien peur que cela puisse entraver la performance.

Chaque appel à Envoyer () passe par un cycle complet d'ouverture de la prise, effectuant la conversation SMTP (HELO , Mail de, rcpt à, données) et fermer la prise. En pseudo code: xxx

( modifier : cette affirmation sur smtpclient.send () est en fait faux comme je ont expliqué dans ma réponse.)

Je penserais que le pseudo code suivant serait plus optimal: xxx

dois-je préoccuper de la performance de smtpclient.send () lors de l'envoi de courrier électronique à un taux élevé? Quelles sont mes options pour optimiser les performances?


4 commentaires

Ces messages sont-ils gérenalement les mêmes, mais à différents destinataires, ou le contenu de l'e-mail différent?


@ROB Levine: même destinataire, mais différent.


À des centaines une seconde? Qui sur Terre veut être enterré sous tant de courriel?


Tout serveur SMTP décent vous ralentira rapidement à un filet.


3 Réponses :



2
votes

Créer un serveur de messagerie qui envoie des courriels asynchroniquement à l'aide d'une threadpool ou de quelque chose. De cette façon, vous pouvez "tirer et oublier" vos emails sur le serveur et laissez-le vous inquiéter de les envoyer tous. Configurez-le avec quelques threads ou plus et il devrait pouvoir fouetter des courriels assez rapidement.


4 commentaires

C'est exactement ce que nous faisons, sauf que nous semblons avoir des problèmes de performance. Ma question concerne le moyen le plus performant de «tirer et oublier» les courriels d'un service .NET.


Quels problèmes de performance? Dans ma mise en œuvre, je pourrais envoyer des milliers de courriels une minute. Est-ce que c'est jetant des exceptions? Celles-ci sont incroyablement lentes dans le courrier, car vous devez très souvent attendre une prise à couper le temps.


En moyenne, nous envoyons actuellement 20 courriels par seconde, mais il existe de nombreux facteurs dans notre environnement qui peuvent affecter ce nombre. Je recherche si nous pouvons améliorer l'envoi du courrier.


Si j'étais vous, je configurerais un petit code de surveillance qui détecte des courriels lents à envoyer et de connecter des informations à leur sujet. De cette façon, vous pourrez peut-être déterminer rapidement si certains paramètres le ralentissent.



8
votes

La classe smtpclient est la mise en cache des connexions de serveur SMTP dans les coulisses. Appelant smtpclient.send () à plusieurs reprises pour soumettre plusieurs messages au même serveur SMTP exécutera efficacement le pseudo code dans le deuxième exemple.

Un moyen d'améliorer les performances peut être d'utiliser plusieurs instances de smtpclient en cours d'exécution sur plusieurs threads. Au lieu d'avoir une seule connexion au serveur SMTP, le service aura maintenant de nombreuses connexions simultanées. Les messages électroniques incommodés sont tirés de la file d'attente et expédiés à un pool de threads de travailleur qui appelle smtpclient.send () pour envoyer le message au serveur SMTP.

J'ai fait des tests rudimentaires et j'ai constaté que cela pourrait améliorer les performances de 100%. Cependant, le nombre optimal de connexions concomitantes et l'amélioration réelle des performances est probablement très dépend du serveur SMTP. Une façon d'étendre cette idée est de se connecter à plusieurs serveurs SMTP.


0 commentaires