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.
quelle
Antworten:
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
quelle
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:
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:
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
quelle
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
quelle