La mia sfida
Abbiamo server Exchange in vari siti, ma anche a bordo di navi. Le navi sono collegate alla nostra rete tramite collegamenti satellitari quando sono in mare, ma passano ai ponti WiFi quando sono in porto.
A causa dell'elevata latenza (500+ ms) e di abbandoni non insoliti (ad esempio quando le navi stanno girando), il tentativo di inviare e-mail al di sopra di qualche megabyte in mare, è probabile che fallisca e venga ripetuto fino al limite è stato raggiunto. Il risultato: l'e-mail non viene recapitata e ogni tentativo consuma preziosa larghezza di banda sul collegamento satellitare.
Una "soluzione" è limitare la dimensione massima dell'e-mail a 5 MB, ma è difficile da usare e una restrizione non necessaria mentre si è in porto.
Vaga idea
Quello che preferirei fare è mettere in coda tutte le e-mail più grandi di un limite prestabilito per la successiva consegna in mare, mentre si inviano immediatamente tutte le piccole e-mail. Pensavo quindi di eseguire regolarmente il ping del server di trasporto hub nel nostro datacenter, quando la latenza scende sotto ~ 400 ms, inizierei a elaborare la grande coda di e-mail. Quando la latenza sale oltre i 400 ms, tapperei il buco e avrei lasciato le e-mail in coda di nuovo.
Ora, non mi sono sporcato le mani con Exchange dalla versione 2003. All'epoca, potevi pianificare grandi e-mail per la consegna successiva, quindi la mia idea era fare qualcosa di simile in Exchange 2010, quindi scrivere un modo per cambiare la consegna programma per e-mail di grandi dimensioni tra 'sempre' e 'mai'.
Ostacolo
Non dovrebbe essere troppo complicato creare uno script del genere, ma poi ho letto che la funzionalità su cui fare affidamento è stata rimossa con Exchange 2007:
Questa era una funzionalità presente in Exchange 2003 ma è stata rimossa per Exchange 2007. È stata impostata su un connettore SMTP con "utilizzare tempi di consegna diversi per i messaggi di grandi dimensioni".
Domande
È vero? - Questa funzionalità non è più presente in Exchange 2010 o si è semplicemente trasformata in qualcosa di simile che posso usare per raggiungere il mio obiettivo? E quindi?
Esiste un altro modo per rinviare la consegna di e-mail di grandi dimensioni su determinati server Exchange? Potrebbe essere basato su un programma o forse anche richiedere un'azione specifica - Sono abbastanza certo che ci sarà un modo per innescare la consegna tramite script, ho solo bisogno di grandi e-mail in una coda separata sulle navi.
I tuoi pensieri su questo saranno molto apprezzati! :-)
Modifica n. 1: raffinata idea approssimativa
Mi sono imbattuto in due CmdLets di PowerShell che penso mi possano avvicinare abbastanza al mio obiettivo:
Ho giocato con Get-Message per un po ', per vedere che tipo di messaggi avrebbero gestito i comandi sopra.
Ancora più importante, questi comandi accettano un filtro dimensioni messaggio. Questo comando elencherà i messaggi in coda, sul server corrente, maggiori di 5 MB (5.242.880 byte):
get-message -Filter {Size -gt 5242880}
Sembra Get-Message
che restituisca solo messaggi da varie code di recapito remoto. Ma i messaggi che scorrono all'interno del server, per quanto brevemente, vengono visualizzati in una coda con cui Get / Suspend / Resume-Message avrà problemi?
In caso contrario, la soluzione potrebbe essere semplice come uno script programmato ogni pochi minuti, sulla falsariga di (in pseudo codice):
if ping_rtt > 400 Then
Suspend-Message -Filter {Size -gt 5242880}
Else
Resume-Message
EndIf
Preoccupazioni / domande di follow-up:
Per lo più irrelvant ora - vedi modifica # 2.
Sarà Get-Message
restituire solo i messaggi da code di recapito remote - mai messaggi per il recapito intra-server? In caso contrario, il nome dell'identità delle code di recapito remoto segue un determinato modello, che posso utilizzare per il filtro?
Potrebbe / dovrebbe essere fatto tramite un agente di trasporto personalizzato (come suggerito da @longneck) o un sink di evento (se questo concetto esiste ancora in Exchange 2010)?
Supponiamo che eseguo lo script ogni 5 minuti, il che significa che vengono inviati messaggi di grandi dimensioni, possono potenzialmente causare problemi fino a 5 minuti, prima di essere sospesi. Staremmo ancora meglio di adesso, ma non è ottimale. Potrei aumentare la frequenza ad ogni minuto, ma non sarebbe la soluzione più elegante.
Anche se controllo solo il tempo di andata e ritorno ogni 5 minuti (per salvare il traffico satellitare), quale meccanismo di Exchange dovrei impostare, per verificare con l'ultimo RTT registrato, ogni volta che viene inviato un messaggio che arriva a una consegna remota fare la coda, e quindi intraprendere azioni appropriate?
Modifica n. 2: soluzioni proposte
Consentitemi di riassumere le soluzioni proposte e i loro pro e contro a mio avviso:
Agente di trasporto personalizzato
Concetto
- Monitorare periodicamente la latenza, classificarla come alta o bassa (soglia: 400 ms?)
- Tramite un agente di trasporto personalizzato, sospendere / riprendere tutte le e-mail superiori a una soglia impostata, quando cambia la classificazione della latenza
- Tramite l'AT personalizzato, metti immediatamente i messaggi di grandi dimensioni inviati successivamente in modalità "sospendi", se la latenza è elevata
Punti di forza
- Le e-mail di grandi dimensioni non vengono mai tentate di recapitare quando la latenza è elevata
Punti di debolezza
- Nessuna capacità di sviluppo per renderlo interno (nota per sé: il codice sorgente dovrebbe appartenere alla mia azienda come parte del contratto con lo sviluppatore esterno)
- Il software di terze parti collegato a Exchange può causare problemi durante l'applicazione di patch o l'aggiornamento
- È necessaria una sorta di accordo di supporto, nel caso in cui qualcosa vada storto (vedi sopra)
Moderati messaggi di grandi dimensioni
Concetto
- Monitorare periodicamente la latenza, classificarla come alta o bassa (soglia: 400 ms?)
- In base alla classificazione della latenza, configura le regole di trasporto di Exchange tramite script, per consentire a tutti i messaggi di fluire o inoltrare messaggi di grandi dimensioni al moderatore
- Approvare i messaggi nella coda del moderatore quando la nave è in porto, possibilmente da un essere umano
Punti di forza
- Le e-mail di grandi dimensioni non vengono mai tentate di recapitare quando la latenza è elevata
- I messaggi vengono sospesi utilizzando le regole di trasporto native di Exchange
Punti di debolezza
- A quanto pare, i messaggi non possono essere approvati a livello di codice quando la latenza è bassa, quindi è necessario l'intervento umano ogni volta che la nave è in porto
- Eventuali problemi di privacy, se la moderazione non viene gestita a livello di codice
Domande
- I messaggi possono essere approvati a livello di codice dalla cassetta postale del moderatore? Come?
Comandi PowerShell pianificati
Concetto
- Monitorare periodicamente la latenza, classificarla come alta o bassa (soglia: 400 ms?)
- Finché la latenza è alta, frequentemente (ogni minuto?) Sospende i messaggi di grandi dimensioni (
Suspend-Message -Filter {Size -gt 5242880}
) - Quando la latenza scende al minimo, riprendi tutti i messaggi (
Resume-Message
)
Punti di forza
- Molto semplice da implementare
Punti di debolezza
- Non è la soluzione più elegante
- La consegna di ogni nuovo messaggio di grandi dimensioni può essere tentata fino a quando l'intervallo tra i
Suspend-Message
comandi, probabilmente sprecando ancora un po 'di larghezza di banda e creando congestioni (anche se molto brevemente rispetto al non fare nulla)
Domande
- Qualche idea su come prevenire i tentativi di recapitare messaggi di grandi dimensioni, tra
Suspend-Message
comandi? - Sarà
Get-Message
restituire solo i messaggi da code di recapito remote - mai messaggi per il recapito intra-server? In caso contrario, il nome dell'identità delle code di recapito remoto segue un determinato modello, che posso utilizzare per il filtro?
Modifica n. 3: The Way Forward
Dopo aver introdotto le soluzioni proposte nel mio team (incluso il proxy SMTP, che non sono riuscito a includere nella modifica n. 2) e in base al mio intuito, abbiamo deciso di optare per un agente di trasporto di Exchange personalizzato.
Sono in contatto con un paio di società di consulenza, che mi risponderanno su come la volontà attaccherà il problema e quanto costerebbe.
Se hai esperienza con le attività di programmazione in outsourcing, sentiti libero di lasciare un feedback alla mia domanda correlata su Stack Overflow , perché io no.