2011-12-16 12 views
5

El enunciado de la pregunta no necesariamente hacer justicia al tema ...¿Cuál es la mejor forma de comunicarse entre un servicio WCF y subprocesos separados?

  • Tengo una interfaz de usuario de cliente sentado en una caja y local con un servicio de Windows fondo para apoyarla mientras realiza funciones de fondo .
  • La interfaz de usuario del cliente es solo la capa de presentación y el servicio de Windows realiza toda la acción contundente ... por lo que debe haber comunicación entre los dos. Después de pasar un tiempo en Google y leer las mejores prácticas, decidí crear la capa de servicio utilizando WCF y las tuberías con nombre.
  • La interfaz de usuario del cliente es el cliente WCF y el servicio de Windows actúa como el host WCF (alojamiento local solamente) para admitir al cliente.

Así que esto funciona bien, como debería. La interfaz de usuario del cliente puede pasar datos al host WCF. Pero mi pregunta es, ¿cómo puedo hacer que esos datos sean útiles? Tengo un par de motores ejecutándose en el servicio de Windows/host WCF, pero el host WCF no está al tanto de la existencia de ningún motor de fondo. Necesito las solicitudes de comunicaciones del cliente para poder interactuar con esos motores.

¿Alguien tiene alguna idea de un buen patrón de diseño o metodología sobre cómo acercarse a facilitar la comunicación entre un host WCF y ejecutando hilos?

+0

¿Está hablando de un patrón de tipo de cola de mensajes? ¿Y necesita hacer cola en las tareas de forma asíncrona y luego informar al cliente una vez finalizado? – slugster

Respuesta

3

Creo que la mejor opción es tener algunas propiedades o métodos estáticos que se puedan usar para intercambiar datos entre los procesos/procesos del servicio y el servicio WCF.

Alternativamente, la forma en que abordamos esto es mediante el uso de una base de datos donde el cliente o el servicio wcf ponen en cola las solicitudes para que el servicio responda y el servicio, cuando está disponible, actualiza la base de datos con las respuestas a esas solicitudes. El cliente entonces sondea la base de datos (a través de WCF) regularmente para recuperar los resultados de cualquier solicitud pendiente.

Por ejemplo, si el cliente necesita generar un informe, activamos una solicitud a través de WCF y WCF crea una solicitud de generación de informes en la base de datos.

El servicio responsable de generar informes periódicamente sondea esta tabla y, cuando encuentra una nueva entrada, genera un nuevo hilo/proceso que genera el informe.

Cuando el informe se ha completado (ya sea con éxito o en caso de error), el servicio actualiza la tabla de la base de datos con el resultado.

Mientras tanto, el cliente le pregunta al servicio WCF regularmente si alguno de los informes enviados ya se ha completado. El servicio WCF a su vez sondea la tabla en busca de cualquier solicitud que se haya completado, pero que aún no se haya entregado al cliente, reúne la información de ellos y los devuelve al cliente.

Este mecanismo nos permite hacer un par de cosas:

1) Podemos escalar el número de servicios de procesamiento de estas solicitudes a través de múltiples máquinas virtuales/físicos a medida que aumenta la carga de trabajo.

2) Un servicio determinado puede admitir a numerosos clientes.

3) A través de la interfaz WCF, podemos ampliar este soporte a cualquier plataforma de cliente que decidamos admitir (web, ganar, tableta, teléfono, etc.).

se olvidó de mencionar:

El hecho de que optar por utilizar una base de datos no significa que usted tiene que con el fin de poner en práctica este patrón. Puede implementar fácilmente la misma funcionalidad creando una colección de solicitudes estáticas a la que el servicio WCF y el servicio de trabajo acceden de forma muy similar a como usamos la base de datos.

Simplemente tendrá que tener mucho cuidado al obtener y soltar bloqueos en las propiedades estáticas para evitar colisiones cruzadas o bloqueos.

+0

Creo que estás muerto con esto. Estaba pensando en usar tablas de bases de datos como un flujo de cola de mensajes, pero estaba un poco preocupado por la sobrecarga en lo que respecta a los registros de la base de datos (viendo cómo puede haber N número de clientes comunicándose con sus servidores). Tu "se olvidó de mencionar" es el mejor plan, creo, porque podría usar una estructura de cola estática para poner en cola los mensajes en lugar de persistirlos donde no tendrían ningún valor después de que se completen. De esta forma, si utilizo procedimientos adecuados de bloqueo de hilos, puedo acceder a los mensajes estáticos y quitarlos de la cola según sea necesario. Muchas gracias. – jermny

Cuestiones relacionadas