¿Debo cambiar de WCF a NserviceBus

13

Tenemos un servidor central que envía y recibe mensajes de varias PC que se encuentran en redes de clientes en varias ubicaciones. Para facilitar esto, actualmente estoy usando WCF con TCPNetBindings, usando comunicación dúplex asegurada con certificados.

Ahora, tenemos una serie de problemas con esto, principalmente porque se nos pide que admitamos el "modo desconectado" (debemos ser tolerantes a fallas). Por lo que sé, no hay una manera simple de hacer esto usando la pila WCF: necesitaríamos implementar algo y quizás usar msmq. He estado mirando NServiceBus últimamente y, por lo que veo, parece encajar bien en la factura: tolerancia a fallas, los mensajes se pueden enviar a través de Internet a través de una simple puerta de enlace http, etc. Sé que es muy respetado en la comunidad y Puedo ver por qué al mirarlo.

Entonces, mi pregunta es ... ¿Emplear NServiceBus suena como una idea sensata, o alguien tiene alguna otra sugerencia / experiencia del mundo real que se relacione con esto? Supongo que me preocupa presentar una nueva tecnología de la que conozco relativamente poco, y enfrentar problemas con cosas como asegurarla, configurar todo de manera confiable, trucos en el camino ... También desconfío del "oro- chapando "la arquitectura y eligiendo algo brillante que terminará empantanándome en la implementación en lugar de seguir con WCF y simplemente hacer que funcione para mí ...

¡Gracias!

Matt Roberts
fuente
1
> admite el "modo desconectado" (debemos ser tolerantes a fallas) ¿No vas a tener que desarrollar mucha tolerancia a fallas en el lado del cliente? La tolerancia a fallas de MSMQ en el servidor es excelente para restaurar el estado en caso de un problema, pero aún veo que ser un gran dolor de cabeza para el cliente, sin importar lo que elija.
Brian
1
Bueno, lo que necesito admitir es la "garantía" de que el cliente enviará un mensaje al servidor y el servidor lo recibirá eventualmente, por lo que si estamos desconectados debemos seguir intentándolo hasta que lleguemos allí. Eso es lo que NSB hace "gratis", mientras que como una solución WCF (creo) requeriría código ...
Matt Roberts
Estoy parcialmente de acuerdo con Brian. MSMQ, si está configurado correctamente en las versiones recientes, le brinda un modo desconectado bastante bueno fuera de la caja siempre que configure la cola y el mensaje para que se comporte de esa manera. El cliente puede conservar los mensajes en la cola saliente local y reenviarlos cuando el servidor vuelva a estar disponible en una cola remota.
Bill
WCF tiene enlaces MSMQ ... Conozco íntimamente varias aplicaciones exitosas a gran escala que hacen uso de esto. Dicho esto, también me gusta nServiceBus, pero hace algo diferente.
Kyle Hodgson

Respuestas:

12

Mi sugerencia, si necesita ser rápido sobre esto y solo necesita algo simple para facilitar la operación duradera (desconectada) con WCF, es buscar en los enlaces WCF - MSMQ. Si necesita algo en un entorno más grande, mire nServiceBus.

En mi opinión, nServiceBus realmente comenzaría a brillar en un entorno distribuido más grande. Tomemos, por ejemplo, el siguiente ejemplo (eso sería un infierno en la tierra con WCF pero simple con nServiceBus):

  • Infraestructura compuesta por nivel de servidor de aplicaciones, nivel de servidor de caché, nivel de base de datos de solo lectura, nivel de base de datos de lectura / escritura
  • Cada vez que el cliente envíe una nueva entrada, realmente le gustaría que todos estos niveles se actualicen a la vez
  • En WCF, necesitaría exponer servicios separados en cada nivel y hacer que el cliente los empuje a todos (o que alguna orquestación central haga lo mismo por usted)
  • En nServiceBus, cada nivel debería estar suscrito a esta información, y el cliente la publicaría una vez, permitiendo que el bus de servicio se encargue del resto

WCF tiene enlaces MSMQ

Sin embargo, si necesita apegarse principalmente a WCF (plazos cortos, necesita otras características de WCF), le sugiero que consulte este artículo en MSDN. Le muestra cómo usar los enlaces WCF para MSMQ y luego le muestra cómo migrar un servicio de HTTP a MSMQ. En el camino le muestra algunos de los problemas con este escenario (y soluciones útiles para estos problemas).

Ambas sugerencias hacen un uso intensivo de MSMQ, por lo que una nota al respecto: a diferencia de Apache MQ, RabbitMQ y otros sistemas de colas populares, MSMQ no es una arquitectura de cola basada en un agente típico, sino que es una cola distribuida. Esto significa que si su cliente WCF envía un mensaje a través de un transporte MSMQ mientras no puede conectarse al servidor remoto que aloja la cola, la máquina del cliente pondrá en cola el mensaje en lo que se conoce como "Cola saliente" localmente. El mensaje permanecerá allí de manera segura hasta que el servicio MSMQ del cliente detecte que puede conectarse nuevamente al servicio MSMQ remoto. En ese punto, el mensaje fluirá desde el cliente hasta el destino final.

Hay al menos una advertencia sobre lo anterior: si el servidor remoto está fuera de línea durante demasiado tiempo (verifique su documentación para MSMQ), el cliente se dará por vencido y moverá el mensaje de la cola de mensajes no entregados. Los mensajes transferidos a la cola de mensajes no entregados no pueden reenviarse automáticamente, deben volver a construirse.

Si necesita cifrado y no tiene ActiveDirectory, en esta entrada de blog , Sergey Sorokin detalla los pasos necesarios para cifrar la comunicación de MSMQ utilizando WCF sin Active Directory.

Kyle Hodgson
fuente
7

No son un reemplazo 1 por 1: muchas veces usará NServiceBus para alimentar mensajes o tomar mensajes de un punto final WCF.

En cualquier caso, el manejo de escenarios de modo desconectado como este es donde las colas de mensajes realmente, realmente brillan. NServiceBus es un buen lugar para comenzar. Hay una serie de otras opciones por ahí. Notaré que muchos de ellos realmente envuelven MSMQ al final del día: MSMQ es un back-end muy sólido y probablemente valga la pena usarlo cuando esté accesible.

Wyatt Barnett
fuente
Gracias. Punto tomado, aunque estoy viendo como un reemplazo 1: 1 en mi caso porque la mayoría de mis comunicaciones WCF están ahí para admitir comunicaciones entre estas PC y el servidor - nsb parece ocuparse de todo esto por mí, por lo tanto, es un intercambio -para mí
Matt Roberts
Entendido, entonces debería funcionar bastante bien para ti.
Wyatt Barnett