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 à ( Je penserais que le pseudo code suivant serait plus optimal: p> dois-je préoccuper de la performance de Envoyer () code> 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: p>
smtpclient.send () code> est en fait faux comme je ont expliqué dans ma réponse.) p>
smtpclient.send () code> lors de l'envoi de courrier électronique à un taux élevé? Quelles sont mes options pour optimiser les performances? P> P>
3 Réponses :
Le processus d'envoi d'un courrier électronique à l'aide de SMTP est spécifié (à l'origine) dans RFC 821 A >. Il y a eu de nombreuses mises à jour et ajouts depuis, mais le protocole de base est toujours le même. Vous devez démarrer chaque transaction avec une commande HELO, puis ajouter les informations de l'expéditeur, les destinataires, etc. Si vous envoyez le même message à tous les destinataires, vous pouvez ajouter plusieurs destinataires dans un seul message. Toutefois, si le texte du message est différent pour chaque destinataire, je pense que vous devrez envoyer des messages individuels à chacun, ce qui signifie une transaction distincte pour chacun. P>
J'ai découvert le smtpclient.send () code> Lorsque cela est appelé à plusieurs reprises uniquement sur la prise de courant, émettez une commande EHLO, puis soumettez plusieurs commandes de courrier et de données à partir de la même connexion.
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. P>
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.
La classe code> smtpclient code> est la mise en cache des connexions de serveur SMTP dans les coulisses. Appelant Un moyen d'améliorer les performances peut être d'utiliser plusieurs instances de 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. P> smtpclient.send () code> à plusieurs reprises pour soumettre plusieurs messages au même serveur SMTP exécutera efficacement le pseudo code dans le deuxième exemple. P>
smtpclient code> 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 () code> pour envoyer le message au serveur SMTP. P>
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.