2010-09-29 14 views
6

Ho un sistema software che esegue l'OCR su più macchine contemporaneamente. Il sistema attuale funziona come segue:Linee guida di progettazione Calcolo distribuito

  1. Tutti i documenti che devono essere nascosti sono inseriti in una tabella in db.
  2. Ogni macchina client ocrorna quella tabella e ogni volta che vengono trovati dati per ocr, blocca la tabella e seleziona n. di file per ocr. Il blocco è usato per l'atomicità.
  3. Dopo ogni documento è ocra, lo stato del documento viene aggiornato come completo.

So che questo è un errore grave per impostare un database come luogo di sincronizzazione. Funziona bene ma a volte riesco a vedere il dead lock sul database ..

Quindi la mia domanda è: qual è il modo migliore per progettare un sistema di questo tipo, voglio database come dispositivo di archiviazione solo non un luogo di sincronizzazione. Voglio sentire i tuoi pensieri.

risposta

5

Bene, potresti avere una colonna nella tabella che dice se il record è attualmente in fase di elaborazione. All'interno di una transazione, recuperare i dati per un record che non è attualmente in fase di elaborazione e aggiornare il record per dire che è ora in fase di elaborazione. I dettagli su come verrà gestita la contesa dipenderanno dal tipo di transazioni che crei e dal database che utilizzi, ma sospetto che le transazioni dovrebbero essere al centro di tutto.

Si suppone che tu sia davvero desideri utilizzare un database piuttosto che una coda di messaggi di qualche descrizione. Potresti considerare l'utilizzo di una coda di messaggi insieme al numero con il database ... e alcuni database hanno code incorporate, il che potrebbe essere utile. Anche se volevi il record nel database, potresti avere una coda solo per gli ID: i clienti potrebbero semplicemente estrarre l'elemento successivo dalla coda, quindi recuperare i dati. Potresti comunque voler registrare l'ora in cui l'articolo è stato estratto dalla coda, in modo che se il client si blocca o qualcosa del genere, un lavoro batch può inserire qualsiasi lavoro non riuscito (ad esempio quelli che sono stati prelevati un giorno fa ma non t hanno ancora i risultati) di nuovo in coda.

+0

Grazie per la tua pronta risposta, ho effettivamente fatto qualcosa di simile che hai menzionato nel tuo primo paragrafo. Ma non sono soddisfatto da questa soluzione. – crypted

+0

@ Int3: perché no? Non sto suggerendo di mantenere aperta la transazione durante l'elaborazione dei dati, ma solo contrassegnandola come in corso. –

2

Con l'utilizzo del polling del database per i file ocr, è preferibile utilizzare il servizio di messaggistica di Windows. Cosa succede se il database è inattivo e il servizio ocr è in esecuzione, il servizio ocr non verrà avviato finché ea meno che il servizio del database non sia attivo, utilizzando la coda di messaggistica di Windows è possibile ottenere le informazioni per il file ocr dal servizio di messaggistica (online o offline). linea) in modo che il servizio ocr si avvii automaticamente dopo l'accensione della macchina e non si verificherà alcun problema di deadlocking nel database.

+0

MSMQ suona bene, suggerito anche da Jon skeet. – crypted

Problemi correlati