Planen Sie große E-Mails in Exchange 2010, und verschieben Sie sie in die Warteschlange, bis die Latenz abnimmt


14

Meine Herausforderung

Wir haben Exchange Server an verschiedenen Standorten, aber auch an Bord von Schiffen. Die Schiffe sind auf See über Satellitenverbindungen mit unserem Netzwerk verbunden, wechseln jedoch im Hafen zu WiFi-Brücken.

Aufgrund der hohen Latenz (über 500 ms) und nicht seltener Ausfälle (z. B. beim Wenden der Schiffe) ist es wahrscheinlich, dass der Versuch, auf See E-Mails über ein paar Megabyte zu senden, fehlschlägt und bis zum Limit wiederholt wird wurde erreicht. Das Ergebnis: Die E-Mail wird nicht zugestellt und jeder Versuch beansprucht wertvolle Bandbreite auf der Satellitenverbindung.

Eine "Lösung" besteht darin, die maximale E-Mail-Größe auf 5 MB zu begrenzen. Dies ist jedoch kaum benutzerfreundlich und stellt eine unnötige Einschränkung dar, wenn Sie sich im Port befinden.

Grobe Vorstellung

Was ich lieber tun würde, ist, alle E-Mails in eine Warteschlange zu stellen, die eine festgelegte Grenze für die spätere Zustellung auf See überschreitet, während alle kleinen E-Mails sofort gesendet werden. Ich dachte damals, ich würde den Hub-Transport-Server in unserem Rechenzentrum regelmäßig anpingen, wenn die Latenz unter ~ 400 ms fällt, würde ich anfangen, die große E-Mail-Warteschlange zu verarbeiten. Wenn die Latenz über 400 ms steigt, würde ich die Lücke schließen und die E-Mails wieder in die Warteschlange stellen.

Ich habe mich seit Version 2003 nicht mehr so ​​richtig mit Exchange befasst. Damals konnten Sie große E-Mails für die spätere Zustellung einplanen. Daher war es meine Idee, in Exchange 2010 etwas Ähnliches zu tun und dann eine Möglichkeit zum Umschalten der Zustellung per Skript zu erstellen Zeitplan für große E-Mails zwischen 'immer' und 'nie'.

Hindernis

Es sollte nicht zu kompliziert sein, ein solches Skript zu erstellen, aber dann habe ich gelesen, dass die Funktion, auf die ich mich stütze, mit Exchange 2007 entfernt wurde:

Diese Funktion war in Exchange 2003 vorhanden, wurde jedoch für Exchange 2007 entfernt. Sie wurde in einem SMTP-Connector mit der Einstellung "Andere Zustellzeiten für übergroße Nachrichten verwenden" festgelegt.

TechCenter: Ist es möglich, die E-Mail-Zustellung anhand der Größe in Exchange zu planen?

Fragen

Ist es wahr? - Ist diese Funktion in Exchange 2010 nicht mehr vorhanden oder wurde sie nur in eine ähnliche Funktion umgewandelt, mit der ich mein Ziel erreichen kann? Wenn ja, was?

Gibt es eine andere Möglichkeit, die Zustellung großer E-Mails auf bestimmten Exchange-Servern aufzuschieben? Es könnte auf einem Zeitplan basieren oder sogar eine bestimmte Aktion erfordern. Ich bin ziemlich sicher, dass es eine Möglichkeit gibt, die Zustellung per Skript auszulösen. Ich benötige nur große E-Mails in einer separaten Warteschlange auf Schiffen.

Ihre Gedanken dazu werden sehr geschätzt! :-)

Edit # 1: Verfeinerte grobe Idee

Ich bin auf zwei PowerShell-CmdLets gestoßen, die mich meinem Ziel ziemlich nahe bringen können:

Ich spielte eine Weile mit Get-Message herum, um zu sehen, mit welcher Art von Nachrichten die obigen Befehle umgehen würden.

Am wichtigsten ist, dass diese Befehle einen Filter für die Nachrichtengröße akzeptieren. Dieser Befehl listet Nachrichten in der Warteschlange auf dem aktuellen Server auf, die größer als 5 MB (5.242.880 Byte) sind:

get-message -Filter {Size -gt 5242880}

Es werden anscheinend Get-Messagenur Nachrichten aus verschiedenen Remotezustellungswarteschlangen zurückgegeben. Aber werden Nachrichten, die innerhalb des Servers fließen,, wie kurz sie auch sein mögen, in einer Warteschlange angezeigt, mit der Get / Suspend / Resume-Message zu tun hat?

Andernfalls könnte die Lösung so einfach wie ein geplantes Skript sein, das alle paar Minuten ausgeführt wird, und zwar im Pseudocode:

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

Bedenken / Nachfragen:

Hauptsächlich irrelevant - siehe Edit 2.

Werden Get-Messagenur Nachrichten aus Remotezustellungswarteschlangen zurückgegeben - niemals Nachrichten für die serverinterne Zustellung? Wenn nicht, folgt der Identitätsname der Remotezustellungswarteschlangen einem bestimmten Muster, das ich zum Filtern verwenden kann?

Könnte / sollte dies über einen benutzerdefinierten Transport-Agent (wie von @longneck vorgeschlagen) oder eine Ereignissenke erfolgen (falls dieses Konzept in Exchange 2010 noch vorhanden ist)?

Angenommen, ich führe das Skript alle 5 Minuten aus, was immer noch bedeutet, dass große Nachrichten gesendet werden. Dies kann möglicherweise zu Problemen von bis zu 5 Minuten führen, bevor das Skript angehalten wird. Wir wären immer noch besser dran als jetzt, aber es ist nicht optimal. Ich könnte die Frequenz auf jede Minute erhöhen, aber es wäre nicht die eleganteste Lösung.

Auch wenn ich nur alle 5 Minuten die Roundtrip-Zeit überprüfe (um Satellitenverkehr zu sparen), welchen Exchange-Mechanismus müsste ich einrichten, um die zuletzt aufgezeichnete RTT jedes Mal zu überprüfen, wenn eine Nachricht gesendet wird, die an eine Remotezustellung gesendet wird Warteschlange und dann entsprechende Maßnahmen ergreifen?

Edit # 2: Lösungsvorschläge

Lassen Sie mich die vorgeschlagenen Lösungen und ihre Vor- und Nachteile zusammenfassen:

Benutzerdefinierter Transport-Agent

Konzept

  • Latenz periodisch überwachen, als hoch oder niedrig klassifizieren (Schwelle: 400 ms?)
  • Unterbrechen / Fortsetzen Sie über einen benutzerdefinierten Transport-Agent alle E-Mails, die einen festgelegten Schwellenwert überschreiten, wenn sich die Latenzklassifizierung ändert
  • Setzen Sie über den benutzerdefinierten TA anschließend gesendete große Nachrichten sofort in den Suspend-Modus, wenn die Latenzzeit hoch ist

Stärken

  • Es wird nie versucht, große E-Mails zuzustellen, wenn die Latenzzeit hoch ist

Schwächen

  • Keine Entwicklungsfähigkeiten, um dies im eigenen Haus zu machen (Hinweis an mich selbst: Quellcode sollte im Rahmen des Vertrags mit dem externen Entwickler meinem Unternehmen gehören)
  • Software von Drittanbietern, die mit Exchange verknüpft ist, kann beim Patchen oder Aktualisieren Probleme verursachen
  • Eine Art Supportvereinbarung ist notwendig, falls etwas schief geht (siehe oben)

Moderate große Nachrichten

Konzept

  • Latenz periodisch überwachen, als hoch oder niedrig klassifizieren (Schwelle: 400 ms?)
  • Konfigurieren Sie anhand der Latenzklassifizierung die Exchange-Transportregeln mithilfe von Skripten, damit entweder alle Nachrichten übertragen werden oder große Nachrichten an den Moderator weitergeleitet werden
  • Genehmigen Sie Nachrichten in der Moderatorwarteschlange, wenn sich das Schiff im Hafen befindet, möglicherweise von einem Menschen

Stärken

  • Es wird nie versucht, große E-Mails zuzustellen, wenn die Latenzzeit hoch ist
  • Nachrichten werden mithilfe systemeigener Exchange-Transportregeln angehalten

Schwächen

  • So wie es aussieht, können Nachrichten nicht programmgesteuert genehmigt werden, wenn die Latenzzeit gering ist. Daher ist jedes Mal, wenn sich ein Schiff im Hafen befindet, ein menschliches Eingreifen erforderlich
  • Möglicherweise Datenschutzprobleme, wenn die Moderation nicht programmgesteuert erfolgt

Fragen

  • Können Nachrichten programmgesteuert aus dem Moderatorpostfach genehmigt werden? Wie?

Geplante PowerShell-Befehle

Konzept

  • Latenz periodisch überwachen, als hoch oder niedrig klassifizieren (Schwelle: 400 ms?)
  • Solange die Latenzzeit hoch ist, werden häufig (jede Minute?) Große Nachrichten ausgesetzt ( Suspend-Message -Filter {Size -gt 5242880}).
  • Wenn die Latenz zu niedrig ist, setzen Sie alle Nachrichten fort ( Resume-Message)

Stärken

  • Sehr einfach zu implementieren

Schwächen

  • Nicht die eleganteste Lösung
  • Die Zustellung jeder neuen großen Nachricht kann so lange wie das Intervall zwischen Suspend-MessageBefehlen versucht werden, wobei möglicherweise immer noch etwas Bandbreite verschwendet wird und Überlastungen entstehen (obwohl dies nur sehr kurz ist, als würde man nichts tun).

Fragen

  • Irgendwelche Ideen, wie Versuche, große Nachrichten zwischen Suspend-MessageBefehlen zu übermitteln, verhindert werden können?
  • Werden Get-Messagenur Nachrichten aus Remotezustellungswarteschlangen zurückgegeben - niemals Nachrichten für die serverinterne Zustellung? Wenn nicht, folgt der Identitätsname der Remotezustellungswarteschlangen einem bestimmten Muster, das ich zum Filtern verwenden kann?

Edit # 3: Der Weg nach vorne

Nachdem ich die vorgeschlagenen Lösungen in meinem Team vorgestellt hatte (einschließlich des SMTP-Proxys, den ich in Bearbeitung 2 nicht berücksichtigt habe), entschieden wir uns aus eigener Überzeugung für einen benutzerdefinierten Exchange-Transport-Agent.

Ich stehe mit einigen Beratungsunternehmen in Kontakt, die sich mit mir in Verbindung setzen, wie das Problem angegangen wird und was es kosten würde.

Wenn Sie Erfahrung mit dem Auslagern von Programmieraufgaben haben, können Sie gerne eine Rückmeldung zu meiner entsprechenden Frage zu Stack Overflow geben , da dies nicht der Fall ist.


3
+1 für eine der besseren Fragen, die ich in letzter Zeit gesehen habe.
John Gardeniers

Welche Rollen haben die Exchange-Server auf den Schiffen?
August

Die Exchange-Server auf Schiffen haben die Rollen Hub-Transport, Postfach und Clientzugriff.
abstrask

1
Führen Sie einen QoS- oder WAN-Optimierer für die Satellitenverbindungen aus?
Longneck

Hmm mit der Mailbox-Rolle, Sie könnten auch den Link satt werden lassen, wenn externe Mail an eine Mailbox von jemandem auf dem Exchange-Server des Schiffes gesendet wird ...
August

Antworten:


2

Um das Problem auf die von Ihnen angeforderte Weise zu lösen, können Sie mit dem Microsoft Exchange Transport Agent SDK einen eigenen Transport-Agent erstellen . Transport Agents sind ereignisbasiert, sodass Exchange beim Empfang einer Nachricht eine Funktion in Ihrer Bibliothek aufruft. Ihre Bibliothek kann dann so etwas wie die Nachricht halten. Wenn Sie nicht die Fähigkeiten haben, dies zu tun, sind Sie sicher, dass Sie einen Entwickler beauftragen könnten, es für Sie zu schreiben.

Aber ich denke nicht, dass dies eine großartige Lösung ist. Als Alternative zur Untersuchung können Sie sich einen SMTP-Proxy für Links mit geringer Qualität ansehen. Wie Sie herausgefunden haben, ist SMTP ein fürchterliches Protokoll für Verbindungen mit geringer Qualität, da eine unterbrochene Verbindung dazu führt, dass die Nachrichtenübertragung von Anfang an neu gestartet wird, anstatt an der Stelle fortzufahren, an der sie aufgehört hat. Wenn Sie einen Entwickler für etwas beauftragen, würde ich in Betracht ziehen, ein Serverprogramm zu schreiben, das eingehende SMTP-Verbindungen akzeptiert und die Nachricht auf eine wiederaufsetzbare Weise an eine Remote-Instanz desselben Programms am anderen Ende der Satellitenverbindung weiterleitet ( Trennen Sie möglicherweise die großen Nachrichten von den kleinen Nachrichten über den TCP-Port, um die QoS-Behandlung durch Ihren WAN-Beschleuniger zu ermöglichen. Die entfernte Instanz könnte dann nach Empfang der vollständigen Nachricht


Danke für deinen Beitrag! Ich muss sagen, es ist viel weniger out-of-the-box-like als ich gehofft hatte. Ich bin ein großer Fan des KISS-Prinzips. Obwohl ich nicht viel über das Schreiben von Transportagenten weiß, ist es für mich etwas zwingend, die Abwicklung in Exchange beizubehalten. In Exchange 2010 werden Warteschlangen anscheinend bei Bedarf erstellt und zerstört. Möglicherweise könnte der Agent große E-Mails in eine separate Warteschlange zwingen, und ein Skript kann zwischen "Anhalten" und "Fortsetzen" wechseln. Gibt es eine Idee, wie Sie mit TAs in Exchange 2010 vorgehen können?
abstrask

Was den SMTP-Proxy- / Smarthost-Vorschlag betrifft, so klingt dies auch als OK-Lösung, wenn ich eine Standardlösung finde, die vorzugsweise aktiv gewartet wird. Es scheint eine komplexere Programmieraufgabe zu sein als ein Exchange-Transport-Agent, der den Ablauf in Exchange ändert (ich könnte mich irren?). Ich habe die Erfahrung gemacht, dass komplexe, maßgeschneiderte Lösungen, wie ich sie mir für einen SMTP-Proxy vorstelle, auf lange Sicht teurer sind.
abstrask

Zu getrennten Warteschlangen: Ich kenne die Interna von Exchange nicht gut genug, um zu wissen, ob Warteschlangen so funktionieren oder ob dies der beste Weg ist. Ich weiß, dass einzelne Nachrichten von einem TA aufgrund meiner Erfahrung mit Litera Metadact-e für die Verarbeitung gespeichert werden können. Dies geschieht genau so: Speichern Sie eine Nachricht, bis die Verarbeitung abgeschlossen ist (was viele Minuten dauern kann). Ich weiß nicht, ob es möglich ist, sie auf unbestimmte Zeit zu halten.
Longneck

Mein genereller Punkt meiner Antwort ist, dass Sie sich wahrscheinlich an einen Entwickler wenden sollten, da es keine sofort einsatzbereite Lösung für Sie gibt. Dies ist jedoch ein ziemlich einfaches Problem, und die Einstellung eines Entwicklers zur Lösung dieses Problems ist wahrscheinlich nicht unerschwinglich.
Longneck

Das Vorhandensein des PowerShell-CmdLet zum Anhalten von Nachrichten ist davon überzeugt, dass der Zustellungsstatus von Nachrichten auch programmgesteuert geändert werden kann. Ich mag die Idee eines benutzerdefinierten Transportagenten, der lediglich den Zustellungsstatus der Nachricht über einen separaten SMTP-Proxy ändert, da wir weiterhin die gesamte Nachrichtenverfolgung, Delegierung von Administratorrechten usw. unter Exchange verwalten können. Danke für deinen Beitrag!
abstrask

3

Nachrichtenmoderation

Eine möglicherweise nicht ideale Lösung besteht darin, Nachrichten über eine bestimmte Größe mithilfe einer Transportregel an den Manager des Absenders oder an ein bestimmtes Postfach (auf dem Exchange-Server des Schiffes) zur Moderation weiterzuleiten. Auf diese Weise können große Nachrichten, wenn sie sich auf See befinden, im Wesentlichen in einer anderen Mailbox in die Warteschlange gestellt werden. Wenn das Schiff im Hafen ankommt, kann der Manager oder der angegebene Moderator die Zustellung genehmigen.

Die Nachteile sind:

  • Diese Regel ist immer aktiviert, es sei denn, Sie deaktivieren sie manuell (dies kann jedoch über ein Skript erfolgen), sodass selbst in einem Port große Nachrichten an das Moderatorpostfach umgeleitet werden
  • Alle großen Nachrichten müssen vor dem Senden manuell überprüft werden. Sie können jedoch in der Regel Ausnahmen für bestimmte Dinge hinzufügen
  • Eine andere Person liest ausgehende E-Mails, was aus Datenschutzgründen möglicherweise nicht ideal ist. Dies hängt jedoch von Ihrer Organisation ab

Ein Vorteil ist, dass Sie einen Menschen haben, der entscheidet, ob eine Nachricht gesendet werden soll oder nicht, zum Beispiel, wenn ein Benutzer versucht, einen Haufen nicht arbeitsbezogenen Mülls zu senden, der die Verbindung ohne Grund zum Erliegen bringt. Sie könnten durch Verwaltungskontrollen wie das Zeigen auf eine Richtlinie und das Klopfen auf das Handgelenk korrigiert werden, damit sie es nicht noch einmal tun.

Exchange 2010-Transportregeln

Benutzerdefiniertes Skript

RE: Ein benutzerdefiniertes Skript zum Verwalten großer E-Mails. Im Folgenden wird möglicherweise etwas angezeigt, das den Sendeconnector auf dem Exchange-Server aktiviert / deaktiviert. Ein Nachteil ist, dass alle E-Mails in der Warteschlange gehalten werden und nicht nur große Nachrichten, aber eine Logik in dieser Richtung sollte funktionieren:

  1. Überprüfen Sie die Latenz. Wenn der Status niedrig ist, aktivieren Sie den Sendeconnector, heben Sie die Suspendierung großer Nachrichten auf und warten Sie 5 Minuten (oder eine andere beliebige Zeitspanne). Wenn es hoch ist, deaktivieren Sie den Sendeconnector.
  2. Warte 5 Minuten.
  3. Überprüfen Sie nach 5 Minuten, ob große Nachrichten vorliegen, und setzen Sie sie aus. Aktivieren Sie den Sendeconnector erneut, damit kleine Nachrichten in der Warteschlange freigegeben werden, bis die Warteschlange leer ist (Sie können sogar jeweils eine Nachricht durchlaufen, um die Warteschlangen- / WAN-Verbindung nach erneuter Aktivierung des Sendeconnectors nicht zu verstopfen).
  4. Deaktivieren Sie den Sendeconnector und gehen Sie zu # 1

Diese Logik ist nicht zu 100% sinnvoll, aber Sie haben die Idee, alle E-Mails in die Warteschlange zu stellen, auf Latenz zu prüfen, große Nachrichten in die Warteschlange zu stellen, die Warteschlange für E-Mails aufzuheben, alle E-Mails in die Warteschlange zu stellen usw. Wenn ein Skript wie dieses abstürzt oder zum Stillstand kommt, wie können Sie es dann neu initialisieren, wenn sich kein IT-Personal an Bord der Schiffe befindet? Möglicherweise werden alle ausgehenden E-Mails auf unbestimmte Zeit gestoppt (wenn sie nach dem Deaktivieren des Sendeconnectors gestoppt werden), oder Sie verlieren die Kontrolle über große Nachrichten, wenn der Sendeconnector aktiviert bleibt und das Skript nicht mehr ausgeführt wird.

SMTP-Proxy

Obwohl Sie angegeben haben, dass Sie gegen eine Nachrichtenbehandlung außerhalb von Exchange sind, habe ich nach weiteren Überlegungen beschlossen, mit @longneck eine Art SMTP-Proxy-Lösung zu verwenden. Sogar IIS SMTP verfügt über einen Mechanismus für die verzögerte Übermittlung, der in Exchange 2010 anscheinend nicht erfolgt. Sie können große Nachrichten an den IIS-SMTP-Server umleiten, auf dem sie auf dem Datenträger gespeichert sind, und den IIS-SMTP-Server bei geringer Latenz zunächst auf Latenz prüfen lassen, um sie über ein Skript zu senden. Der schlimmste Fall, wenn Ihr Planungsmechanismus hängen bleibt oder angehalten wird, besteht darin, dass große Nachrichten auf der Festplatte hängen bleiben, kleine Nachrichten jedoch weiterhin gesendet werden. Es gibt wahrscheinlich bessere Lösungen als IIS SMTP, und ich habe es selbst nie verwendet, aber es ist nur ein Beispiel.

Konfigurieren Sie SMTP-E-Mail in IIS 7


Danke für deinen Beitrag! Obwohl nicht direkt angegeben, ist es für mich eine Voraussetzung, dass die zurückgestellten E-Mails ihr Ziel schließlich unverändert erreichen. Ist dies der Fall, wenn sie zum ersten Mal an ein Moderator-Postfach weitergeleitet werden, oder hinterlassen sie verborgene oder sichtbare Zeichen? Was den manuellen Genehmigungsprozess angeht, würde ich denken, dass dies irgendwie per Skript erfolgen kann?
abstrask

Gute Frage, und da ich dies noch nie implementiert habe, habe ich eine schnelle Testregel in unserer Exchange-Organisation erstellt und eine Test-E-Mail gesendet. Der Moderator hat die Nachricht mit der Option "Genehmigen" oder "Ablehnen" erhalten. Nachdem ich die Nachricht genehmigt hatte, wurde sie freigegeben und unverändert ohne Anzeichen des Moderatorpostfachs im Nachrichtenkopf oder im E-Mail-Text an das Ziel gesendet. Ich kann jedoch anscheinend nichts zum Erstellen von Skripten für den Genehmigungsprozess finden, sodass Sie möglicherweise tatsächlich einen Menschen für diese Aufgabe bestimmen müssen.
August

Vielen Dank für die Idee. Ich würde denken, dass die Regel leicht durch Skripten geändert werden kann, aber der menschliche Eingriff ist ein großer Nachteil für uns, da wir kein dediziertes IT-Personal an Bord haben. Weiß jemand, ob Nachrichten programmgesteuert genehmigt werden können und wie?
Abstrask

2

Schauen Sie sich die neuen Funktionen der Nachrichtenbeschränkung an, die mit Exchange 2010 SP1 eingeführt wurden. Dies könnte für Ihren Anwendungsfall sehr hilfreich sein.

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


1
Ich bin mir nicht sicher, ob Message Throttling in diesem speziellen Szenario helfen würde. Das Lesen des Artikels scheint eher darauf ausgerichtet zu sein, zu verhindern, dass ein Transport- oder Edgeserver mit einer Tonne von Nachrichten überlastet wird. Daher werden Kosten berechnet, um eine QoS-artige Nachrichtenübermittlung zu gewährleisten. In diesem Fall kann ein einzelner Benutzer, der eine 10-MB-Nachricht sendet, die gesamte WAN-Verbindung überlasten, sodass andere Dienste nicht verfügbar sind. Ein aufgeschobener Übermittlungsmechanismus wäre meiner Meinung nach angemessener.
August

1
Entschuldigung, aber wie ich es gelesen habe, wird "Nachrichtenbeschränkung" nur das Senden kleinerer Nachrichten bevorzugen ( Standardmäßig ist das Verhältnis von normal zu niedrig 20: 1 ), nicht jedoch das Senden größerer Nachrichten. Haben Sie einen genaueren Vorschlag, wie Sie mein Ziel erreichen können? Vielen Dank.
abstrask
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.