Planifier / mettre en file d'attente des e-mails volumineux dans Exchange 2010, reporter jusqu'à ce que la latence baisse

14

Mon défi

Nous avons des serveurs Exchange sur divers sites, mais aussi à bord de navires. Les navires sont connectés à notre réseau via des liaisons par satellite lorsqu'ils sont en mer, mais passent aux ponts WiFi lorsqu'ils sont au port.

En raison de la latence élevée (500+ ms) et des abandons non rares (par exemple lorsque les navires tournent), tenter d'envoyer des e-mails au-dessus de quelques mégaoctets en mer est susceptible d'échouer et d'être réessayé jusqu'à la limite a été atteint. Le résultat: l'e-mail n'est pas livré et chaque essai consomme une bande passante précieuse sur le lien satellite.

Une «solution» consiste à limiter la taille maximale des e-mails à 5 Mo, mais ce n'est guère convivial et une restriction inutile pendant le port.

Idée approximative

Ce que je préférerais faire, c'est mettre en file d'attente tous les e-mails supérieurs à une limite définie pour une livraison ultérieure en mer, tout en envoyant tous les petits e-mails immédiatement. Je pensais alors que je ferais régulièrement une requête ping au serveur de transport concentrateur dans notre centre de données, lorsque la latence tombe en dessous de ~ 400 ms, je commençais à traiter la grande file d'attente des e-mails. Lorsque la latence augmente de plus de 400 ms, je boucherais le trou et laisserais les e-mails faire la queue à nouveau.

Maintenant, je n'ai pas vraiment mis la main sur Exchange depuis la version 2003. À l'époque, vous pouviez planifier de gros e-mails pour une livraison ultérieure, alors mon idée était de faire quelque chose de similaire dans Exchange 2010, puis de créer un script pour changer la livraison. programmez des e-mails volumineux entre «toujours» et «jamais».

Obstacle

Cela ne devrait pas être trop compliqué de créer un script comme ça, mais j'ai lu ensuite que la fonctionnalité sur laquelle je comptais a été supprimée avec Exchange 2007:

Cette fonctionnalité était présente dans Exchange 2003 mais a été supprimée pour Exchange 2007. Elle a été définie sur un connecteur SMTP avec «utiliser des délais de livraison différents pour les messages surdimensionnés».

TechCenter: Est-il possible de planifier la livraison des e-mails en fonction de la taille dans Exchange?

Des questions

Est-ce vrai? - Cette fonctionnalité n'est-elle plus présente dans Exchange 2010, ou s'est-elle simplement transformée en quelque chose de similaire, que je peux utiliser pour atteindre mon objectif? Si oui, quoi?

Existe-t-il un autre moyen de différer la livraison de gros e-mails sur certains serveurs Exchange? Cela pourrait être basé sur un calendrier ou peut-être même nécessiter une action spécifique - je suis assez certain qu'il y aura un moyen de déclencher la livraison via un script, j'ai juste besoin de gros e-mails dans une file d'attente séparée sur les navires.

Votre opinion à ce sujet sera très appréciée! :-)

Edit # 1: Idée approximative raffinée

Je suis tombé sur deux CmdLets PowerShell qui, je pense, peuvent me rapprocher assez de mon objectif:

J'ai joué avec Get-Message pendant un certain temps, pour voir quel type de messages les commandes ci-dessus traiteraient.

Plus important encore, ces commandes acceptent un filtre de taille de message. Cette commande répertorie les messages en file d'attente, sur le serveur actuel, d'une taille supérieure à 5 Mo (5 242 880 octets):

get-message -Filter {Size -gt 5242880}

Il semble Get-Messageque ne renvoie que les messages de diverses files d'attente de remise à distance. Mais les messages circulant dans le serveur, même brièvement, apparaissent-ils dans une file d'attente avec laquelle Get / Suspend / Resume-Message va jouer?

Sinon, la solution pourrait être aussi simple qu'un script planifié toutes les quelques minutes, dans le sens de (en pseudo code):

if ping_rtt > 400 Then
    Suspend-Message -Filter {Size -gt 5242880}
Else
    Resume-Message
EndIf

Préoccupations / questions de suivi:

Actuellement peu pertinent - voir la modification n ° 2.

Renvoie Get-Messageuniquement les messages des files d'attente de remise distantes - jamais les messages pour la remise intra-serveur? Sinon, le nom d'identité des files d'attente de remise à distance suit-il un certain schéma que je peux utiliser pour le filtrage?

Cela pourrait-il / devrait-il être fait via un agent de transport personnalisé (comme suggéré par @longneck) ou un récepteur d'événements (si ce concept existe toujours dans Exchange 2010)?

Supposons que j'exécute le script toutes les 5 minutes, ce qui signifie toujours que des messages volumineux sont envoyés, peut potentiellement causer des problèmes jusqu'à 5 minutes avant d'être suspendu. Nous serions encore mieux lotis qu'aujourd'hui, mais ce n'est pas optimal. Je pourrais augmenter la fréquence à chaque minute, mais ce ne serait pas la solution la plus élégante.

Même si je ne vérifie que le temps d'aller-retour toutes les 5 minutes (pour économiser le trafic sat), quel mécanisme d'échange aurais-je besoin de configurer, afin de comparer avec le dernier RTT enregistré, chaque fois qu'un message est envoyé qui va à une livraison à distance file d'attente, puis prendre des mesures appropriées?

Édition n ° 2: Solutions proposées

Permettez-moi de résumer les solutions proposées, ainsi que leurs avantages et inconvénients tels que je les vois:

Agent de transport personnalisé

Concept

  • Surveillez périodiquement la latence, classifiez-la comme élevée ou faible (seuil: 400 ms?)
  • Grâce à un agent de transport personnalisé, suspendez / reprenez tous les e-mails supérieurs à un seuil défini, lorsque la classification de latence change
  • Grâce à l'assistance technique personnalisée, mettez immédiatement les messages volumineux soumis ultérieurement en mode "suspension", si la latence est élevée

Forces

  • Les e-mails volumineux ne sont jamais tentés lorsque la latence est élevée

Faiblesses

  • Aucune compétence de développement pour faire cela en interne (note à soi-même: le code source doit appartenir à mon entreprise dans le cadre du contrat avec le développeur externe)
  • Les logiciels tiers liés à Exchange peuvent provoquer des problèmes lors de l'application de correctifs ou de mises à jour
  • Une sorte d'accord de support nécessaire en cas de problème (voir ci-dessus)

Messages modérés volumineux

Concept

  • Surveillez périodiquement la latence, classifiez-la comme élevée ou faible (seuil: 400 ms?)
  • En fonction de la classification de latence, configurez les règles de transport Exchange via des scripts, pour laisser tous les messages circuler ou transférer des messages volumineux au modérateur
  • Approuver les messages dans la file d'attente du modérateur lorsque le navire est dans le port, éventuellement par un humain

Forces

  • Les e-mails volumineux ne sont jamais tentés lorsque la latence est élevée
  • Les messages sont suspendus à l'aide des règles de transport Exchange natives natives

Faiblesses

  • De par son apparence, les messages ne peuvent pas être approuvés par programme lorsque la latence est faible, donc une intervention humaine est requise chaque fois que le navire est dans le port
  • Peut-être des problèmes de confidentialité, si la modération n'est pas gérée par programme

Des questions

  • Les messages peuvent-ils être approuvés par programme à partir de la boîte aux lettres du modérateur? Comment?

Commandes PowerShell planifiées

Concept

  • Surveillez périodiquement la latence, classifiez-la comme élevée ou faible (seuil: 400 ms?)
  • Tant que la latence est élevée, suspendez fréquemment (toutes les minutes?) Les gros messages ( Suspend-Message -Filter {Size -gt 5242880})
  • Lorsque la latence devient faible, reprenez tous les messages ( Resume-Message)

Forces

  • Très simple à mettre en œuvre

Faiblesses

  • Pas la solution la plus élégante
  • La livraison de chaque nouveau gros message peut être tentée aussi longtemps que l'intervalle entre les Suspend-Messagecommandes, peut-être encore gaspiller de la bande passante et créer des congestions (bien que très brièvement par rapport à ne rien faire)

Des questions

  • Avez-vous des idées sur la façon d'empêcher les tentatives de livraison de gros messages, entre les Suspend-Messagecommandes?
  • Renvoie Get-Messageuniquement les messages des files d'attente de remise distantes - jamais les messages pour la remise intra-serveur? Sinon, le nom d'identité des files d'attente de remise à distance suit-il un certain schéma que je peux utiliser pour le filtrage?

Edit # 3: La voie à suivre

Après avoir apporté les solutions proposées dans mon équipe (y compris le proxy SMTP, que je n'ai pas réussi à inclure dans l'édition n ° 2), et en fonction de mon intuition, nous avons décidé d'opter pour un agent de transport Exchange personnalisé.

Je suis en contact avec quelques sociétés de conseil, qui me répondront comment ils s'attaqueront au problème et ce qu'il en coûterait.

Si vous avez une expérience avec l'externalisation des tâches de programmation, n'hésitez pas à laisser des commentaires sur ma question connexe sur Stack Overflow , car je n'en ai pas.

abstrask
la source
3
+1 pour l'une des meilleures questions que j'ai vues récemment.
John Gardeniers
Quels rôles occupent les serveurs Exchange sur les navires?
août
Les serveurs Exchange sur les navires détiennent les rôles de transport Hub, de boîte aux lettres et d'accès client.
abstrask
1
utilisez-vous un type d'optimiseur QoS ou WAN sur les liaisons par satellite?
longneck
Hmm avec le rôle de boîte aux lettres, vous pouvez également avoir le lien saturé lorsque le courrier externe est envoyé à la boîte aux lettres de quelqu'un sur le serveur Exchange du navire ...
août

Réponses:

2

Pour résoudre le problème comme vous l'avez demandé, vous pouvez écrire votre propre agent de transport à l'aide du SDK de l'agent de transport Microsoft Exchange . Les agents de transport sont basés sur des événements, donc Exchange appellera une fonction dans votre bibliothèque lorsqu'un message est reçu. Votre bibliothèque peut alors faire quelque chose comme retenir le message. Si vous n'avez pas les compétences en interne pour le faire, je suis sûr que vous pourriez embaucher un développeur pour l'écrire pour vous.

Mais je ne pense pas que ce soit une excellente solution. Comme alternative pour vous d'enquêter, vous voudrez peut-être chercher quelque chose comme un proxy SMTP pour les liens de faible qualité. Comme vous l'avez découvert, SMTP est un protocole horrible pour les liaisons de faible qualité car une connexion interrompue fait redémarrer la transmission des messages depuis le début au lieu de reprendre là où elle s'était interrompue. Si vous allez embaucher un développeur pour quelque chose, j'envisagerais d'écrire un programme serveur qui accepte les connexions SMTP entrantes et envoie le message à une instance distante de ce même programme à l'autre extrémité de la connexion satellite de manière résumable ( éventuellement séparer les gros messages des petits messages via le port TCP pour permettre le traitement QoS par votre accélérateur WAN). L'instance distante pourrait alors, à réception du message complet,

long cou
la source
Merci pour votre contribution! Je dois dire que c'est beaucoup moins prêt à l'emploi que je l'espérais. Je suis un grand fan du principe KISS. Bien que je ne sache pas grand-chose sur l'écriture d'agents de transport, il est quelque peu convaincant pour moi de conserver la gestion dans Exchange. Dans Exchange 2010, il semble que les files d'attente soient créées et détruites à la demande. Peut-être que l'agent pourrait forcer les gros messages dans une file d'attente distincte et un script peut basculer entre «suspendre» et «reprendre». Une idée est que c'est le genre de chose que vous pouvez faire avec les TA dans Exchange 2010?
abstrask
Quant à la suggestion de proxy / smarthost SMTP, elle semble également être une solution OK, si je peux trouver une solution standard, de préférence activement maintenue. Cela semble être une tâche de programmation plus grande et plus complexe qu'un agent de transport Exchange, qui modifie le flux dans Exchange (je peux me tromper?). D'après mon expérience, les solutions complexes et sur mesure, comme j'imagine un proxy SMTP, ont tendance à être coûteuses à prendre en charge à long terme.
abstrask
re: files d'attente séparées, je ne connais pas suffisamment les fonctions internes d'Exchange pour savoir si les files d'attente fonctionnent comme ça, ou si c'est la meilleure façon. Je sais que les messages individuels peuvent être conservés par un TA pour le traitement en fonction de mon expérience avec Litera Metadact-e, qui fait exactement cela: garder un message jusqu'à ce qu'il soit terminé le traitement (ce qui peut prendre plusieurs minutes). je ne sais pas s'il est possible de les conserver indéfiniment.
longneck
mon point global de ma réponse est que vous devriez probablement consulter un développeur car il n'y a pas de solution prête à l'emploi pour vous. cependant, c'est un problème assez simple et embaucher un développeur pour résoudre ce problème pour vous n'est probablement pas prohibitif.
longneck
L'existence du Suspend-Message PowerShell CmdLet a été convaincue que l'état de remise des messages peut également être modifié par programme. J'aime l'idée d'un agent de transport personnalisé, qui modifie simplement l'état de livraison du message, sur un proxy SMTP séparé, car nous serons en mesure de conserver tout le suivi des messages, la délégation des droits d'administrateur, etc. sous Exchange. Merci pour votre contribution!
abstrask
3

Modération des messages

Une solution probablement non idéale consiste à utiliser une règle de transport pour transférer les messages d'une certaine taille au gestionnaire de l'expéditeur ou à une boîte aux lettres désignée (sur le serveur Exchange du navire) pour modération. De cette façon, s'ils sont en mer, les gros messages peuvent être mis en file d'attente dans une autre boîte aux lettres. Lorsque le navire arrive au port, le gestionnaire ou le modérateur désigné peut les approuver pour la livraison.

Les inconvénients sont:

  • cette règle est toujours activée, sauf si vous la désactivez manuellement (mais cela peut être fait via un script), donc même dans le port, les messages volumineux seraient redirigés vers la boîte aux lettres du modérateur
  • tous les gros messages devraient être examinés manuellement par quelqu'un avant d'être envoyés, mais vous pouvez ajouter des exceptions dans la règle pour des choses spécifiques
  • une autre personne lirait le courrier sortant, ce qui n'est peut-être pas idéal en raison de problèmes de confidentialité, mais cela dépend de votre organisation

Un avantage est que vous auriez un humain à prendre des décisions sur l'envoi ou non d'un message, par exemple si un utilisateur essayait d'envoyer un tas de conneries non liées au travail qui ne feraient qu'embourber la connexion sans raison. Ils pourraient être corrigés par des contrôles administratifs comme le fait de pointer vers une politique et de les frapper au poignet pour qu'ils ne recommencent pas.

Règles de transport Exchange 2010

Script personnalisé

RE: Un script personnalisé pour gérer les gros e-mails. Je pouvais voir quelque chose comme ci-dessous qui activerait / désactiverait votre connecteur d'envoi sur le serveur Exchange. Un inconvénient est que tout le courrier est conservé dans la file d'attente au lieu de simplement les gros messages, mais une logique dans ce sens devrait fonctionner:

  1. Vérifiez la latence. S'il est faible, activez le connecteur d'envoi, suspendez tout message volumineux et attendez 5 minutes (ou toute autre durée arbitraire). S'il est élevé, désactivez le connecteur d'envoi.
  2. Attends 5 minutes.
  3. Après 5 minutes, recherchez les gros messages et suspendez-les. Réactivez le connecteur d'envoi pour que les petits messages en file d'attente soient libérés jusqu'à ce que la file d'attente soit vide (vous pouvez même parcourir un message à la fois afin de ne pas obstruer la liaison file d'attente / WAN après avoir réactivé le connecteur d'envoi)
  4. Désactivez le connecteur d'envoi et passez à # 1

Cette logique n'est pas complètement peaufinée pour avoir un sens à 100%, mais vous avez l'idée - mettre en file d'attente tous les messages, vérifier la latence, suspendre les gros messages s'ils sont élevés, annuler la mise en file d'attente des messages, mettre tous les messages en file d'attente, etc. un script comme celui-ci est si jamais il tombe en panne ou s'arrête, comment sauriez-vous le réinitialiser sans personnel informatique à bord des navires? Il peut potentiellement arrêter tous les messages sortants indéfiniment (s'il s'arrête après avoir désactivé le connecteur d'envoi) ou vous pouvez perdre votre contrôle de message volumineux s'il laisse simplement le connecteur d'envoi activé et que le script n'est plus en cours d'exécution.

Proxy SMTP

Même si vous avez indiqué que vous êtes contre toute gestion de messages en dehors d'Exchange, après y avoir réfléchi un peu plus, j'ai décidé que je suis avec @longneck sur l'utilisation d'un certain type de solution proxy SMTP. Même IIS SMTP dispose d'un mécanisme de remise différée qui ne semble pas être le cas pour Exchange 2010. Vous pouvez rediriger des messages volumineux vers le serveur SMTP IIS qui pourrait les stocker sur le disque et, en vérifiant d'abord la latence, demander au serveur SMTP IIS de les envoyer via un script lorsque la latence est faible. Le pire des cas si votre mécanisme de planification est bloqué ou arrêté serait que les gros messages restent bloqués sur le disque, mais les petits messages continuent d'être envoyés. Il existe probablement de meilleures solutions que IIS SMTP, et je ne l'ai jamais utilisé moi-même, mais ce n'est qu'un exemple.

Configurer le courrier électronique SMTP dans IIS 7

août
la source
Merci pour votre contribution! Bien que cela ne soit pas directement spécifié, il est pour moi impératif que les e-mails différés parviennent finalement à leur destination sans modification. Est-ce le cas, lors de leur première transmission vers une boîte aux lettres de modérateur, ou laissera-t-il des signes - cachés ou visibles? Quant au processus manuel d'approbation, je pense que cela peut être scripté d'une manière ou d'une autre?
abstrask
Bonne question, et comme je ne l'ai jamais implémenté, j'ai créé une règle de test rapide dans notre organisation Exchange et envoyé un e-mail de test. Le modérateur a reçu le message avec une option «Approuver» ou «Rejeter». Une fois que j'ai approuvé le message, il a été libéré et envoyé à la destination sans modification, sans aucun signe de la boîte aux lettres du modérateur, n'importe où dans l'en-tête du message ou le corps de l'e-mail. Je n'arrive pas à trouver quoi que ce soit sur l'écriture de scripts du processus d'approbation, donc vous devrez peut-être réellement désigner un humain pour cette tâche.
août
Merci beaucoup pour l'idée. Je pense que la règle peut facilement être modifiée par le biais de scripts, mais la partie intervention humaine est un gros inconvénient pour nous, car nous n'avons pas de personnel informatique dédié à bord. Est-ce que quelqu'un sait si les messages peuvent être approuvés par programme et comment?
abstrask
2

Essayez de jeter un coup d'œil aux nouvelles fonctionnalités de "Message Throttling" introduites avec Exchange 2010 SP1. Cela pourrait être très utile pour votre cas d'utilisation.

http://technet.microsoft.com/en-us/library/bb232205(v=exchg.141).aspx

Emyl
la source
1
Je ne suis pas sûr que la limitation des messages aiderait dans ce scénario particulier. En lisant l'article, il semble plus destiné à empêcher un serveur de transport ou Edge d'être submergé par une tonne de messages, il applique donc le coût pour donner un niveau de livraison de message de type QoS. Dans ce cas, bien qu'un seul utilisateur envoyant un message de 10 Mo puisse saturer l'ensemble de la liaison WAN, rendant les autres services indisponibles. Un mécanisme de livraison différée serait plus approprié, je pense.
août
1
Désolé, mais au fur et à mesure que je le lis, "Message Throttling" ne fera que favoriser l' envoi de petits messages ( par défaut, le rapport de message normal / bas est de 20: 1 ), n'empêchera pas l' envoi de messages plus gros. Avez-vous une suggestion plus précise sur la façon d'atteindre mon objectif? Merci.
abstrask