Domanda

Guardando al futuro, fino a quando verrà creata una Web Farm ...

Abbiamo diverse applicazioni di servizio di Windows che eseguono varie attività di back-ground: invio di e-mail, miniature / elaborazione di file ecc.

In un ambiente server server, in teoria potremmo installare ed eseguire ogni servizio su ogni macchina, tuttavia potrebbero esserci conflitti dovuti a oggetti business basati su "first-write-win"; o duplicazione indesiderata di attività, ad esempio: le stesse e-mail vengono inviate più volte.

La "quotazione in prima scrittura" vince " lo scenario può essere superato attraverso il codice o la logica che risolve il problema o salta l'elemento. (se si tratta di un meccanismo di accodamento di base (elenco di query e record di processo) verrà appena riprovato)

Per la duplicazione delle attività, si potrebbero eseguire attività nelle transazioni per impedire ad altri processi di afferrare le stesse risorse, tuttavia immagino che aspetteranno e dovremmo gestire alcuni accessi in base alle cose che accadono di nuovo? Sarebbe così?

Per evitare la duplicazione delle attività sto pensando di costruire forse un meccanismo che scriva una "bandiera di blocco" al database che verrà impostato dal primo servizio che viene avviato. Questo flag sarà datato e farà riferimento all'istanza del servizio. Il servizio che "possiede" il flag eseguirà le attività e aggiornerà periodicamente questa data. Ci sarà anche un'impostazione di timeout / tolleranza su ciascun servizio nella situazione in cui il servizio non possiede la bandiera, controllerà la tolleranza e subentrerà se necessario.

Sembra una soluzione accettabile o si dovrebbe passare a una soluzione basata sull'accodamento dei messaggi migliore in quella fase (anche non si è sicuri di come funzionerebbe in un ambiente agricolo?

Tecnologie: C # / ASP.NET / SQL Server

È stato utile?

Soluzione

Posso pensare a due meccanismi.

  1. Se tutte le attività derivano dalle attività del database, è possibile creare un nuovo "task" tabella e imposta i trigger sulle attività in modo che venga inserito un nuovo record con le informazioni sull'attività. I servizi di Windows possono quindi eseguire il polling delle "attività" tabella e utilizzare una transazione atomica di selezione ed eliminazione per garantire che solo un servizio lo faccia.

  2. È possibile utilizzare una coda di messaggi e rilasciare le attività su di essa, quindi i servizi di Windows eseguono il polling della coda. Ogni messaggio in coda potrà essere rimesso in coda solo da un singolo servizio in modo da poter garantire che ogni attività venga eseguita una sola volta. Ovviamente devi preoccuparti del caricamento sulla coda dei messaggi. A seconda della tua applicazione, potresti utilizzare qualcosa come il Simple Queue Service di Amazon che ti allevierebbe doverti preoccupare di affidabilità e scalabilità.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top