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-Message
nur 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-Message
nur 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-Message
Befehlen 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-Message
Befehlen zu übermitteln, verhindert werden können? - Werden
Get-Message
nur 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.