Devo trocar de WCF para NserviceBus

13

Temos um servidor central que envia e recebe mensagens de vários PCs localizados nas redes clientes em vários locais. Para facilitar isso, atualmente estou usando o WCF com TCPNetBindings, usando comunicação duplex protegida com certificados.

Agora, temos uma série de problemas com isso - principalmente o fato de estarmos sendo solicitados a oferecer suporte ao "modo desconectado" (precisamos ser tolerantes a falhas). Pelo que sei, não há uma maneira simples de fazer isso usando a pilha do WCF - precisaríamos implementar algo e talvez usar o msmq. Ultimamente, tenho visto o NServiceBus e, pelo que vejo, parece se encaixar bem na tolerância a falhas - tolerância a falhas, mensagens podem ser enviadas pela Internet por meio de um simples gateway http etc. Sei que é bem respeitado na comunidade e Eu posso ver o porquê de olhar para ele.

Então, minha pergunta é ... Empregar o NServiceBus parece uma idéia sensata ou alguém tem outras sugestões / experiências do mundo real relacionadas a isso? Acho que estou preocupado em introduzir uma nova tecnologia sobre a qual eu conheço relativamente pouco e enfrentar problemas com coisas como protegê-la, configurar tudo de uma maneira confiável, truques ao longo do caminho. Também tenho receio de plaquear "a arquitetura e escolher algo brilhante que acabará me atrapalhando na implementação versus ficar com o WCF e apenas fazê-lo funcionar para mim ..

Obrigado!

Matt Roberts
fonte
1
> suporte ao "modo desconectado" (precisamos ser tolerantes a falhas) Você ainda não precisará criar muita tolerância a falhas no lado do cliente? A tolerância a falhas do MSMQ no servidor é ótima para restaurar o estado em caso de um problema, mas ainda vejo que essa é uma grande dor de cabeça no cliente, independentemente da escolha que você escolher.
18712
1
Bem, o que eu preciso dar suporte é a "garantia" de que o cliente enviará uma mensagem ao servidor e o servidor a receberá eventualmente - portanto, se estivermos offline, precisamos continuar tentando até chegar lá. Isso é o que NSB faz "de graça", ao passo que como uma solução WCF (eu acho) exigiria código ..
Matt Roberts
Eu concordo parcialmente com Brian. O MSMQ, se configurado corretamente nas versões recentes, oferece um modo desconectado bastante bom, desde que você configure a fila e a mensagem para que se comportem dessa maneira. O cliente pode manter as mensagens na fila de saída local e reenviar quando o servidor estiver novamente disponível em uma fila remota.
Bill
O WCF possui ligações MSMQ ... Conheço intimamente vários aplicativos bem-sucedidos em larga escala que fazem uso disso. Dito isto, eu também gosto do nServiceBus, mas faz uma coisa diferente.
Kyle Hodgson

Respostas:

12

Minha sugestão, se você precisar ser rápido sobre isso e precisar apenas de algo simples para facilitar a operação durável (desconectada) com o WCF, é procurar as ligações WCF - MSMQ. Se você precisar de algo em um ambiente maior, consulte o nServiceBus.

Na minha opinião, o nServiceBus realmente começaria a brilhar em um ambiente distribuído maior. Tomemos, por exemplo, o exemplo a seguir (que seria um inferno na terra com o WCF, mas simples com o nServiceBus):

  • Infraestrutura composta por camada de servidor de aplicativos, camada de servidor de cache, camada de banco de dados somente leitura, camada de banco de dados de leitura / gravação
  • Sempre que o cliente envia uma nova entrada, você realmente deseja que todas essas camadas sejam atualizadas de uma só vez
  • No WCF, você precisa expor serviços separados em cada nível de camada e solicitar que o cliente envie a todos eles (ou que alguma orquestração central faça o mesmo por você)
  • No nServiceBus, cada camada seria assinante dessas informações e o cliente as publicaria uma vez, permitindo que o barramento de serviço cuide do resto

O WCF possui ligações MSMQ

No entanto, se você preferir ficar com o WCF (prazos curtos, outros recursos do WCF), sugiro que você verifique este artigo no MSDN. Ele mostra como usar as ligações do WCF para o MSMQ e, em seguida, mostra como migrar um serviço do HTTP para o MSMQ. Ao longo do caminho, ele mostra alguns dos problemas desse cenário (e soluções úteis para esses problemas).

Ambas as sugestões fazem uso pesado do MSMQ, portanto, uma observação sobre isso: diferente do Apache MQ, RabbitMQ e outros sistemas populares de enfileiramento, o MSMQ não é uma arquitetura de fila típica baseada em broker, é uma fila distribuída. Isso significa que, se o seu cliente WCF enviar uma mensagem por um transporte MSMQ enquanto não puder se conectar ao servidor remoto que hospeda a fila, a máquina cliente enfileirará a mensagem no que é conhecido como "Fila de saída" localmente. A mensagem permanecerá lá com segurança até que o serviço MSMQ do cliente detecte que ele pode se conectar ao serviço MSMQ remoto novamente. Nesse ponto, a mensagem fluirá do cliente para o destino final.

Há pelo menos uma ressalva acima - se o servidor remoto estiver off-line por muito tempo (verifique sua documentação quanto ao MSMQ), o cliente desistirá e moverá a mensagem da saída para a fila de devoluções. As mensagens transferidas para a fila de devoluções não podem ser reenviadas automaticamente, elas devem ser recriadas.

Se você precisar de criptografia e não tiver o ActiveDirectory, nesta entrada de blog , Sergey Sorokin detalha as etapas necessárias para criptografar a comunicação do MSMQ usando o WCF sem o Active Directory.

Kyle Hodgson
fonte
7

Eles não são uma substituição 1 por 1 - muitas vezes você usará o NServiceBus para alimentar mensagens ou receber mensagens de um ponto de extremidade do WCF.

De qualquer forma, lidar com cenários de modo desconectado como este é o lugar onde as filas de mensagens realmente brilham. O NServiceBus é um bom lugar para começar. Existem várias outras opções por aí. Observarei que muitos deles realmente envolvem o MSMQ no final do dia - o MSMQ é um back-end muito sólido e provavelmente vale a pena usá-lo quando estiver acessível.

Wyatt Barnett
fonte
Obrigado. Ponto considerado, embora eu esteja vendo uma substituição 1: 1 no meu caso, porque a maioria das minhas comunicações WCF está lá para oferecer suporte a comunicações entre esses computadores e o servidor - o nsb parece cuidar de tudo isso para mim, portanto é uma troca para mim.
Matt Roberts
Entendi, então deve funcionar muito bem para você.
Wyatt Barnett