Meu desafio
Temos servidores Exchange em vários locais, mas também a bordo de navios. Os navios estão conectados à nossa rede através de links de satélite quando estão no mar, mas mudam para pontes WiFi quando estão no porto.
Devido à alta latência (500+ ms) e interrupções incomuns (por exemplo, quando os navios estão virando), a tentativa de enviar e-mails acima de alguns megabytes enquanto no mar provavelmente falha e pode ser tentada novamente até o limite foi alcançado. O resultado: o email não é entregue e cada tentativa consome uma largura de banda valiosa no link via satélite.
Uma "solução" é limitar o tamanho máximo de e-mail para 5 MB, mas isso dificilmente é fácil de usar e é uma restrição desnecessária enquanto estiver na porta.
Ideia aproximada
O que eu prefiro fazer é enfileirar todos os e-mails maiores que um limite definido para entrega posterior no mar, enquanto envia todos os e-mails pequenos imediatamente. Eu estava pensando em fazer ping no servidor de transporte de hub em nosso datacenter regularmente, quando a latência cai abaixo de ~ 400 ms, eu começava a processar a grande fila de emails. Quando a latência sobe mais de 400 ms, eu tapava o buraco e deixava os e-mails na fila novamente.
Agora, eu não sujo minhas mãos com o Exchange desde a versão 2003. Naquela época, era possível agendar emails grandes para entrega posterior, então minha ideia era fazer algo semelhante no Exchange 2010 e criar uma maneira de alternar a entrega. agende grandes e-mails entre 'sempre' e 'nunca'.
Obstáculo
Não deve ser muito complicado criar um script como esse, mas li que o recurso em que eu confiava foi removido com o Exchange 2007:
Esse era um recurso presente no Exchange 2003, mas foi removido para o Exchange 2007. Ele foi definido em um Conector SMTP com o 'uso de prazos de entrega diferentes para mensagens de tamanho grande'.
TechCenter: É possível agendar a entrega de email com base no tamanho do Exchange?
Questões
É verdade? - Esse recurso não está mais presente no Exchange 2010 ou apenas se transformou em algo semelhante que posso usar para atingir meu objetivo? Se sim, o que?
Existe outra maneira de adiar a entrega de emails grandes em determinados servidores Exchange? Pode ser com base em um cronograma ou talvez até exigir uma ação específica - tenho certeza de que haverá uma maneira de acionar a entrega por meio de script, só preciso de emails grandes em uma fila separada nos navios.
Seus pensamentos sobre isso serão muito apreciados! :-)
Edição # 1: Idéia aproximada refinada
Eu me deparei com dois CmdLets do PowerShell que acho que podem me aproximar bastante do meu objetivo:
Eu brinquei com o Get-Message por um tempo, para ver que tipo de mensagens os comandos acima lidariam.
Mais importante ainda, esses comandos aceitam um filtro de tamanho de mensagem. Este comando listará as mensagens na fila, no servidor atual, maiores que 5 MB (5.242.880 bytes):
get-message -Filter {Size -gt 5242880}
Parece que Get-Message
apenas retorna mensagens de várias filas de entrega remota. Mas as mensagens que fluem dentro do servidor, ainda que brevemente, aparecem em uma fila na qual Get / Suspend / Resume-Message irá mexer?
Caso contrário, a solução pode ser tão simples quanto um script agendado a cada poucos minutos, seguindo as linhas de (no pseudo-código):
if ping_rtt > 400 Then
Suspend-Message -Filter {Size -gt 5242880}
Else
Resume-Message
EndIf
Preocupações / perguntas de acompanhamento:
Principalmente irrelvant agora - veja a edição # 2.
Irá Get-Message
retornar apenas as mensagens de filas de entrega remota - nunca mensagens para entrega intra-servidor? Caso contrário, o nome da identidade das filas de entrega remota segue um certo padrão que eu posso usar para filtrar?
Isso pode / deve ser feito por meio de um agente de transporte personalizado (como sugerido por @longneck) ou de um coletor de eventos (se esse conceito ainda existir no Exchange 2010)?
Digamos que eu execute o script a cada 5 minutos, o que ainda significa que mensagens grandes sendo enviadas podem potencialmente causar problemas por até 5 minutos, antes de serem suspensas. Ainda estaríamos melhor do que estamos agora, mas não é o ideal. Eu poderia aumentar a frequência a cada minuto, mas não seria a solução mais elegante.
Mesmo se eu apenas verificar o tempo de ida e volta a cada 5 minutos (para economizar tráfego sat), qual mecanismo do Exchange eu precisaria configurar, para verificar o último RTT gravado, cada vez que uma mensagem é enviada para uma remota remota fila e, em seguida, executar ações apropriadas?
Edit # 2: Soluções propostas
Permitam-me resumir as soluções propostas e seus prós e contras, como eu o vejo:
Agente de Transporte Personalizado
Conceito
- Monitore periodicamente a latência, classifique-a como alta ou baixa (limite: 400 ms?)
- Por meio de um Agente de transporte personalizado, suspenda / retome todos os emails maiores que um limite definido, quando a classificação de latência for alterada
- Por meio do AT personalizado, coloque imediatamente as mensagens grandes enviadas posteriormente no modo "suspender", se a latência for alta
Forças
- E-mails grandes nunca são tentados entregues quando a latência é alta
Fraquezas
- Nenhuma habilidade de desenvolvimento para fazer isso internamente (observação: o código-fonte deve pertencer à minha empresa como parte do contrato com o desenvolvedor externo)
- O software de terceiros vinculado ao Exchange pode causar problemas ao corrigir ou atualizar
- É necessário algum tipo de contrato de suporte, caso algo dê errado (veja acima)
Mensagens grandes moderadas
Conceito
- Monitore periodicamente a latência, classifique-a como alta ou baixa (limite: 400 ms?)
- Com base na classificação de latência, configure as Regras de Transporte do Exchange por meio de script, para permitir que todas as mensagens fluam ou encaminhar mensagens grandes para o moderador
- Aprovar mensagens na fila do moderador quando o navio estiver no porto, possivelmente por um ser humano
Forças
- E-mails grandes nunca são tentados entregues quando a latência é alta
- As mensagens são suspensas usando regras de transporte nativas nativas do Exchange
Fraquezas
- Pelo que parece, as mensagens não podem ser aprovadas programaticamente quando a latência é baixa; portanto, é necessária intervenção humana sempre que o navio está no porto
- Possivelmente problemas de privacidade, se a moderação não for tratada de forma programática
Questões
- As mensagens podem ser aprovadas programaticamente a partir da caixa de correio do moderador? Quão?
Comandos agendados do PowerShell
Conceito
- Monitore periodicamente a latência, classifique-a como alta ou baixa (limite: 400 ms?)
- Desde que a latência seja alta, freqüentemente (a cada minuto?) Suspende qualquer mensagem grande (
Suspend-Message -Filter {Size -gt 5242880}
) - Quando a latência cair para baixo, retome todas as mensagens (
Resume-Message
)
Forças
- Muito simples de implementar
Fraquezas
- Não é a solução mais elegante
- A entrega de cada nova mensagem grande pode ser tentada enquanto o intervalo entre os
Suspend-Message
comandos, possivelmente ainda desperdiçando alguma largura de banda e criando congestionamentos (embora muito brevemente comparado a não fazer nada)
Questões
- Alguma idéia de como impedir tentativas de entregar mensagens grandes,
Suspend-Message
comandos intermediários ? - Irá
Get-Message
retornar apenas as mensagens de filas de entrega remota - nunca mensagens para entrega intra-servidor? Caso contrário, o nome da identidade das filas de entrega remota segue um certo padrão que eu posso usar para filtrar?
Edição # 3: O caminho a seguir
Depois de apresentar as soluções propostas em minha equipe (incluindo o proxy SMTP, que não incluí na edição nº 2), e com base no meu próprio pressentimento, decidimos optar por um Exchange Transport Agent personalizado.
Estou em contato com algumas empresas de consultoria, que responderão a mim como o problema será atacado e o que custaria.
Se você tem alguma experiência com tarefas de programação de terceirização, sinta-se à vontade para deixar comentários sobre minha pergunta relacionada ao Stack Overflow , porque não.