2012-04-17 14 views
6

Actualmente estoy creando un proceso para nuestra empresa que toma algunos datos de una base de datos (A), hace algo de trabajo sobre los datos y luego los copia en otra tabla en otra base de datos (B). La cantidad de datos que procesamos en grandes cantidades y esperamos que este proceso tarde mucho tiempo (semanas).¿WCF es la elección correcta para un largo proceso de importación de datos?

¿Es una elección sensata de diseño para este tipo de tarea utilizar WCF? De esa manera, pensé que podría tener algún tipo de aplicación cliente/front-end web (que el resto de la empresa puede usar) para 'consultar'/mostrar el progreso del proceso general de importación. También me gustaría dar a los clientes la capacidad de iniciar/pausar/detener el proceso de importación a través del servicio.

¿Es esto factible en WCF? ¿Es esta la elección correcta? Supongo que de alguna manera esto necesita actuar como un servicio de Windows normal (¿pensé que sería más fácil 'consultar' el progreso de la importación a través de algunos métodos que podría exponer a través de WCF?)

Además, podría ejecutar en problemas, por ejemplo, si un usuario intentó iniciar/detener el proceso de importación al mismo tiempo, etc. ¿Es el patrón singleton el encargado de garantizar que todos trabajen con el mismo proceso de importación único?

Todos los pensamientos/ideas son muy apreciados.

+0

Dado que está transfiriendo muchos datos, es posible que desee utilizar otro serializador y luego los WCF de stock. La página [protobuf-net benchmark] (http://code.google.com/p/protobuf-net/wiki/Performance) tiene una buena comparación entre todos los serializadores. –

+0

Aunque podría estar equivocado, no creo que esté planeando mover muchos datos a través de WCF, solo consultar el estado del proceso. Si esa es una suposición incorrecta, tengo una respuesta para revisar ... – eouw0o83hf

+0

Ah, sí, lo siento, ¿no sería preferible que el servicio hiciera el mismo "trabajo" de importación? –

Respuesta

2

Editar/Prefacio: Esta respuesta se supone que desea utilizar WCF sólo para la interacción del usuario con el proceso en lugar de para la comunicación de toda la pila de software, y que el trabajo de la base se hace por el servicio de larga duración sí mismo.

Sí, esto es factible en WCF, y probablemente sea la solución correcta. Tendrás un hilo de procesador de larga ejecución que frecuentemente consulta/actualiza un conjunto de propiedades de interoperabilidad (por ejemplo, actualizará el porcentaje hecho, el artículo en el que está trabajando, y buscará un indicador de "pausa", etc. .). Esas propiedades serán a su vez consultadas/establecidas por los métodos de interfaz WCF.

El patrón singleton es perfecto para esto: si su subprocesamiento está configurado correctamente, los usuarios interactuarán con algunas propiedades que el hilo de ejecución prolongada (o subprocesos) verifican.

Desde una perspectiva de muy alto nivel, la clase de procesador probablemente se parecería a esto en el núcleo (esto es solo un modelo de cómo se puede hacer, no lo hagas exactamente así o tendré pesadillas) :

// IWcfProcessor is the ServiceContract interface 
// Processor runs as a singleton and does (or has a thread that does) the processing work 
class Processor : IWcfProcessor 
{ 
    public Processor() 
    { 
     new Thread(Process).Start(); 
    } 

    public void Process() 
    { 
     while (Run) 
     { 
      // Do long-running process stuff, update some tables 
      PercentDone += 0.1; 
     } 
    } 

    public decimal PercentDone { get; set; } 
    public bool Run { get; set; } 

    /// WCF method defined in IWcfProcessor 
    public void SetState(bool state) 
    { 
     Run = state; 
    } 

    /// WCF method defined in IWcfProcessor 
    public decimal GetStatus() 
    { 
     return PercentDone; 
    } 
} 

a continuación, puede enganchar en los puntos de contacto IWcfProcessor de una web o una aplicación de punto final.

Además, podría tener problemas, por ejemplo, si un usuario intentó iniciar/detener el proceso de importación al mismo tiempo, etc.?

Suponiendo que configure la interpolación de subprocesamiento correctamente, no tendrá problemas.

¿El patrón singleton es el indicado para garantizar que todos trabajen con el mismo proceso de importación único?

Sí, esto es perfecto.

+0

No entiendo muy bien cómo funciona Process() + Run –

+0

virtual -1. No entiendo cómo esto puede resolver el problema del tiempo de espera. En WCF, toda la carga útil debe enviarse y esto no sería factible con una gran carga útil. – Aliostad

+0

@ daemonfire300 Ese es el núcleo del proceso de larga duración. Es un método que se ejecutará en un subproceso: ejecutará algún código, y periódicamente comprobará si debe continuar o hacer una pausa, por eso comprueba 'Ejecutar'. – eouw0o83hf

2

Sí. Esto puede funcionar con WCF Streaming. Aquí, eche un vistazo a mi answer para otra pregunta similar.

Cuestiones relacionadas