2010-09-29 18 views
6

Tengo un sistema de software que realiza OCR en varias máquinas simultáneamente. El sistema actual funciona de la siguiente manera:Directrices de diseño Computación distribuida

  1. Todos los documentos que deben ocultarse se insertan en una tabla en db.
  2. Cada máquina de cliente del cliente agrupa esa tabla y cada vez que se encuentran datos para el tiempo, bloquea la tabla y selecciona n no. de archivos por ocr. Locking se usa para la atomicidad.
  3. Después de que se oculta cada documento, el estado del documento se actualiza como completo.

Sé que este es un error grave al establecer una base de datos como lugar de sincronización. Funciona bien, pero a veces puedo ver el bloqueo muerto en la base de datos ...

Así que mi pregunta es, ¿cuál es la mejor manera de diseñar dicho sistema, quiero base de datos como un dispositivo de almacenamiento, pero no un lugar de sincronización. Quiero escuchar tus pensamientos

Respuesta

5

Bueno, podría tener una columna en la tabla que indique si el registro se está procesando actualmente. Dentro de una transacción, busque los datos de un registro que no se está procesando actualmente y actualice el registro para decir que ahora se está procesando. Los detalles de cómo se manejará la disputa allí dependerán del tipo de transacciones que cree y de la base de datos que use, pero sospecho que las transacciones deberían ser el centro de todo.

Supongo que realmente desea utilizar una base de datos en lugar de una cola de mensajes de alguna descripción. Puede considerar utilizar una cola de mensajes junto con con la base de datos ... y algunas bases de datos tienen colas incorporadas, lo que también podría ser útil. Incluso si también quisiera el registro en la base de datos, podría tener una cola solo de los ID: los clientes podrían simplemente sacar el siguiente elemento de la cola y luego buscar los datos. Es posible que aún desee registrar la hora a la que se extrajo el elemento de la cola, de modo que si el cliente se cuelga o algo así, un trabajo por lotes puede poner cualquier trabajo fallido (por ejemplo, los que fueron recogidos hace un día pero no todavía tiene resultados) en la cola.

+0

Gracias por su pronta respuesta, en realidad he hecho algo similar que usted mencionó en su primer párrafo. Pero no estoy satisfecho con esta solución. – crypted

+0

@ Int3: ¿Por qué no? No sugiero mantener la transacción abierta mientras procesamos los datos, solo mientras lo marcamos en progreso. –

2

Al usar el sondeo de la base de datos para archivos ocr, es mejor usar el servicio de mensajes de Windows. ¿Qué sucede si la base de datos no funciona y su servicio operativo se está ejecutando? El servicio no comenzará hasta que, a menos que el servicio de la base de datos esté activo, con el uso de la cola de mensajes de Windows puede obtener la información del archivo del servicio de mensajería (en línea o no). línea) para que el servicio ocr se inicie automáticamente después de que la máquina esté activa y no haya ningún problema de bloqueo en la base de datos.

+0

MSMQ suena bien, lo cual también es sugerido por Jon skeet. – crypted

Cuestiones relacionadas