Domanda

Devo mettere in coda eventi e attività per sistemi esterni in modo affidabile / transazionale. L'uso di cose come MSMQ o ActiveMQ sembra molto seducente, ma la parte transazionale diventa complicata (MSDTC, ecc.).

Potremmo usare il database (SQL Server 2005+, Oracle 9+) e ottenere un supporto transazionale più semplice, ma la parte di accodamento diventa più brutta.

Nessuna delle due rotte sembra così eccezionale ed è piena di cattivi gotchas e casi limite.

Qualcuno può offrire una guida pratica in questa materia?

Pensa: E / C / A o un motore di attività pianificato che si sveglia di tanto in tanto e controlla se ci sono attività pianificate che devono essere eseguite in questo momento (ovvero la data della prossima esecuzione è trascorsa, ma la data di scadenza ha non ancora raggiunto).

È stato utile?

Soluzione

il nostro sistema ha 60 computer, ognuno dei quali esegue 12 attività (thread) che devono " ottenere il prossimo lavoro " ;. Tutto sommato, si tratta di 50.000 "lavori". al giorno. fare il calcolo di quante transazioni al minuto e realizzare che il tempo dell'attività è variabile, quindi è possibile ottenere più "pop" eventi allo stesso tempo.

Avevamo la nostra prima versione usando MSMQ. conclusione: stai lontano . Anche se ha funzionato bene con i problemi di caricamento e sincronizzazione, ha avuto 2 problemi. uno fastidioso e uno da rompere.

fastidioso: come software Enterprise, MSMQ ha esigenze di sicurezza che lo rendono ancora una cosa da impostare e combattere con l'amministratore di rete dei clienti.

Deal breaker: poi è arrivato il momento in cui volevamo fare il prossimo lavoro, ma non usando un semplice pop ma qualcosa di simile a "ottenere il prossimo lavoro BLU" " oppure " ottieni il prossimo lavoro GIALLO " ;. non posso farlo!

Siamo andati al piano B: abbiamo implementato la nostra Q con una singola tabella SQL 2005. non potrebbe essere più felice

Ho stressato testarlo con 200K messaggi al giorno, ha funzionato. Possiamo fare il "prossimo" logica complicata quanto vogliamo.

il problema: devi stare molto attento con l'SQL che prende l'elemento successivo. Dal momento che vuoi che sia veloce e NON bloccabile. ci sono 2 suggerimenti SQL molto importanti che abbiamo usato sulla base di alcune ricerche. La magia è simile a questa:

SELECT TOP 1 @Id = callid
FROM callqtbl WITH (READPAST, XLOCK)
where 1=1 ORDER BY xx,yy

Altri suggerimenti

Ho visto MSMQ usato in modo transazionale e non mi è sembrato particolarmente complicato: un ambito di transazione includeva le chiamate di accodamento o di svuotamento insieme all'accesso al database e tutto andava bene fintanto che la coda veniva definita come transazionale una volta creata. Non credo che ciò sia vero con ActiveMQ, che è un broker di messaggi, ma MSMQ è installato localmente su ogni macchina endpoint, quindi ottenere un articolo in modo transazionale nella coda non richiede una transazione distribuita elaborata.

Probabilmente ne sei già consapevole, ma su .NET ci sono alcune librerie leggere che forniscono alcune belle astrazioni su MSMQ (e teoricamente anche altri trasporti)

nServiceBus: www.nservicebus.com

Transito di massa: http://code.google.com/p/masstransit/

Inoltre, Oren Eini ha un'interessante coda transazionale basata su file system sperimentale. Il vantaggio di questa libreria è che, a differenza di MSMQ, può essere distribuito come libreria e non richiede il mal di testa di manutenzione della distribuzione di MSMQ.

Puoi leggerlo qui: http://ayende.com/Blog/archive/2008/08/01/Rhino.Queues.Storage.Disk.aspx

Inoltre, SQL Server 2005 gestisce l'accodamento in modo abbastanza elegante, utilizzando SQL Server Service Broker, ma è necessario che SQL Server sia installato su ciascun endpoint e non so se SSB attraversi il firewall.

Infine, se non trovi la risposta che cerchi qui, consiglio vivamente il forum di discussione nSErviceBus. Udi Dahan risponde a questo tipo di domande insieme alla sua piccola banda di follower orientati ai messaggi ed è la migliore risorsa che ho trovato finora per ottenere risposte alle mie domande orientate alla coda in modo rapido e competente. Quel forum è qui: http://tech.groups.yahoo.com/group/nservicebus/

Quartz.Net è un sistema di pianificazione dei lavori open source.

Questo è ciò per cui MSMQ è progettato: fare la fila con le transazioni. Se ciò non funziona per te, dai un'occhiata al "Service Broker" funzionalità di SQL Server: è la coda "quotata in una tabella SQL" che "csmba" descrive nella sua risposta, ma è un componente integrato di SQL Server, ben confezionato ed esposto per l'uso.

WebSphere MQ (serie MQ) è un'opzione? Supporta la messaggistica transazionale.

Puoi vedere la funzione Oracle denominata Accodamento avanzato

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