2010-08-04 16 views
8

I necesita crear un sistema que comprende de 2 componentes:servidor de inserción vs extracción de cliente para la topología agente y el servidor

  • un único servidor que los datos de proceso y almacena. También envía periódicamente actualizaciones a los agentes

  • Múltiples agentes que están instalados en puntos finales remotos. Estos recogen datos en (a menudo, pero no siempre) las operaciones de larga ejecución, y estos datos tiene que llegar al servidor

estoy usando C# .NET, y lo ideal sería que desea utilizar una comunicación que cumplen las normas método (es decir, uno que también podría funcionar teóricamente con Java, ya que también podemos usar agentes de Java en el futuro). ¿Hay alguna alternativa a los servicios web? ¿Cuáles son mis opciones?

La forma en que veo que tengo 3 opciones utilizando servicios web, y han hecho las siguientes observaciones:

  • Extracción de cliente
    • No se abra el puerto requerido en el agente, ya que actúa como una
    • cliente
    • tendría que consultar al servidor de actualizaciones
  • Server push
    • puerto abierto en el agente, ya que actúa como un servidor
    • Server debe sondear agentes para resultados
  • híbrido
    • puerto abierto en el agente, ya que actúa como tanto un cliente y un servidor
    • Sin sondeo; servidor empuja actualizaciones cuando sea necesario, el cliente envía los resultados cuando estén disponibles

El 'híbrido' (donde los agentes son tanto el cliente y servidor parece la opción obvia - pero esta aplicación normalmente se instala en entornos empresariales y gubernamentales, y estoy preocupado que pueden tener un problema con la apertura de un puerto en el agente. soy insistir demasiado en esto?

¿hay otras ventajas y desventajas que he perdido a cabo?

Respuesta

5

Nuestros amigos de http://www.infrastructures.org confían en los mecanismos de tracción: http://www.infrastructures.org/papers/bootstrap/bootstrap.html

Una razón importante por la que prefieren el cliente de extracción sobre el servidor push es que los clientes pueden estar abajo, y los clientes deben (en general) se aplican todas las operaciones empujadas por los servidores.Si este criterio no es importante en su caso, tal vez su conclusión no será su conclusión, pero creo que vale la pena leer la sección "Empujar frente a tirar" de su artículo para determinarlo usted mismo.

+0

Oh, sí, sobre el puerto: creo que la mayoría de los administradores de red se darían cuenta de que las comunicaciones de red que se originan en cualquiera de los puntos finales cantidad de riesgo, y permitir puertos de apertura en los agentes si eso conduce a las arquitecturas más limpias. Solo amenazan con hacer un túnel a través del puerto 80, y creo que comprenderán que tener sus propios puertos es un beneficio. :) – sarnold

+0

Heh, por mucho que me gustaría también, no creo que NIST sea demasiado feliz si dijera eso :) – Cocowalla

+1

Además, solo tienes un nodo que necesitas mantener constantemente "activo" para el sistema para seguir trabajando Es más fácil volver a conectar un cliente de extracción muerto una vez que está solucionado que lidiar con un cliente push muerto. –

2

Si usa algún tipo de messagi ng server (JMS for Java, no estoy seguro de C#), su servidor de mensajería es el único que necesita abrir un puerto y puede tener una comunicación bidireccional de su agente al servidor de mensajería y del servidor al servidor de mensajería. Esto le permitiría lograr el modelo híbrido sin necesidad de abrir un puerto en el servidor agente.

+0

Considere la comunicación bidireccional en .NET también, pero al igual que RMI, no es compatible estándar :) – Cocowalla

2

en mi humilde opinión, me parece la mejor opción es la opción de tracción .. que puede satisfacer sus principales requisitos del sistema de la siguiente manera:

La primera parte: Los datos tienen que llegar al servidor, eso es, obviamente, se puede hacer a través de la invocación un método web que envía esa información como un parámetro

2da parte: (El servidor envía periódicamente actualizaciones a los agentes): Todavía puede hacer eso a través de tiradas del cliente (regulares) mediante algún tipo de método de servicio web que " pregunta "por las actualizaciones desde su última extracción (algún tipo de sello de tiempo para obtener las actualizaciones perdidas)

The hybri El método me parece un poco extraño dado que pienso en un agente como parte del sistema que probablemente esté "fuera de línea" con bastante frecuencia. ¿Qué hará el servidor si falla? por lo general es una pregunta/decisión difícil, especialmente si no está seguro de si esto está destinado a "desconectarse" o una falla del sistema o de la red ... etc.

3

Yo diría que en esta época solo puede considerar seriamente tecnologías de extracción. El problema con el push es que los clientes a menudo se ocultan detrás de los dispositivos Network Address Traversal (NAT) como los enrutadores inalámbricos, los módems de banda ancha o los firewalls de la empresa y, en la mayoría de los casos, no son accesibles desde el servidor.

Realizar conexiones de salida ('phone-home'), especialmente en puertos conocidos como HTTP/HTTPS, puede asumirse básicamente como 'posible' incluso en la mayoría de las redes restringidas.

+0

No veo que esta aplicación se use en Internet, solo dentro de entornos corporativos (donde por supuesto hay firewalls involucrados). No veo a los agentes que las conexiones salientes con un servidor sean un problema, pero las empresas pueden no estar dispuestas a permitir las conexiones entrantes a los agentes, ¿qué opinas? – Cocowalla

+0

Los administradores de red corporativos suelen ser bastante exigentes con la apertura de nuevos puertos entrantes. Si puedes mantenerte dentro de las restricciones de 'el cliente siempre usa HTTP' (es decir, la aplicación puede ejecutarse en un navegador web), tendrás una historia de implementación * mucho * más fácil. Por supuesto, no todas las aplicaciones pueden vivir con tal restricción, no puedo conocer sus detalles. –

Cuestiones relacionadas