Frage

Ich brauche Ereignisse und Aufgaben für externe Systeme in einer zuverlässigen / Transaktions Art und Weise in der Warteschlange. Mit Dingen wie MSMQ oder ActiveMQ sehr verführerisch aussehen, aber der Transaktions Teil kompliziert wird (MSDTC, etc).

Wir könnten die Datenbank (SQL Server 2005+, Oracle 9+) verwenden und erreichen leichte Transaktionsunterstützung, aber die Warteschlangen Teil wird hässlicher.

Weder Weg scheint so toll und mit fiesen gotchas und Grenzfällen gefüllt.

Kann jemand etwas praktische Anleitung in dieser Angelegenheit anbieten?

Denken: E / C / A oder eine geplante Task-Engine, die jeder so oft aufwacht und sehen, ob es irgendwelche geplanten Aufgaben sind, die (dh der nächsten Laufstellung zu diesem Zeitpunkt müssen laufen vergangen, aber Ablauf-Datum hat noch nicht erreicht).

War es hilfreich?

Lösung

Unser System hat 60 Computer, die jeweils 12 laufen Aufgaben (Threads), die "get nächsten Job" zu müssen. Alles in allem kommt es auf 50K „Jobs“ pro Tag. die Mathematik, wie viele Transaktionen pro Minute und realisiert Aufgabe Zeit ist variabel, so ist es möglich, mehr „Pop“ Ereignisse an der exakt gleichen Zeit zu erhalten.

Wir hatten unsere erste Version MSMQ verwenden. Fazit: wegbleiben . Während es ganz gut mit der Last und Synchronisierungsproblemen tat, hatte es 2 Probleme. eine lästige und ein Deal Breaker.

Annoying:. als Enterprise-Software, hat MSMQ Sicherheitsanforderungen, die es nur noch eine Sache zu gründen und zu kämpfen mit dem Kunden Netzwerk-Admin machen

Deal Breaker: dann kam die Zeit, dass wir die nächste Aufgabe zu übernehmen wollten, aber nicht ein einfaches Pop, aber so etwas wie "bekommt nächsten BLUE Job" oder "get nächsten YELLOW Job" verwenden. kann es nicht!

Wir gingen Plan B: Durchgeführt eigenen Q mit einer einzigen SQL 2005-Tabelle. konnte nicht glücklicher sein

ich gestresst Test mit 200K Nachrichten pro Tag arbeitete. Wir können die „nächste“ Logik machen so kompliziert, wie wir wollen.

Der Haken: Sie müssen mit dem SQL sehr vorsichtig sein, dass das nächste Element nimmt. Da Sie es schnell und nicht abschließbar sein wollen. gibt es zwei sehr wichtige SQL Hinweise verwendet wir auf einige Forschung. Der Zauber geht in etwa so:

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

Andere Tipps

Ich habe MSMQ gesehen verwendet transaktions und es schien nicht besonders kompliziert - eine Transaktion SCope wickelte die enqueue oder dequeue Anrufe zusammen mit den Datenbankzugriff und alles war gut, solange die Warteschlange wie transaktionale definiert wurde, sobald es erstellt wurde. Ich glaube nicht, dies mit ActiveMQ wahr ist, die ein Nachrichten-Broker, aber MSMQ wird lokal auf jedem Endpunkt Maschine so immer ein Element transaktions in die Warteschlange erfordert keine Phantasie verteilte Transaktion installiert.

Sie sind wahrscheinlich bereits Kenntnis davon, aber auf .NET gibt es ein paar leichten Bibliotheken, die ein paar schöne Abstraktionen über MSMQ liefern (und theoretisch andere Transporte als auch)

nServiceBus: www.nservicebus.com

Mass Transit: http://code.google.com/p/masstransit/

Auch Oren Eini hat eine interessante, wenn experimentelle Dateisystem basiert, Transaktionswarteschlange. Der Vorteil dieser Bibliothek ist, dass, im Gegensatz zu MSMQ, kann es als eine Bibliothek eingesetzt werden und erfordert keine Wartung Kopfschmerzen MSMQ der Bereitstellung.

lesen Sie, dass hier: http://ayende.com/Blog/archive/2008/08/01/Rhino.Queues.Storage.Disk.aspx

Auch SQL Server 2005 behandeln ziemlich elegant Queuing, SQL Server Service Broker verwenden, aber Sie werden SQL Server an jedem Endpunkt installiert sein, und ich weiß nicht, ob SSB die Firewall durchquert.

Schließlich, wenn Sie Sie hier suchen die Antwort nicht erhalten Ich empfehle das nSErviceBus Diskussionsforum. Udi Dahan beantwortet diese Art von Fragen zusammen mit seiner kleinen Schar Nachricht orientierte Anhänger, und es ist die beste Ressource, die ich gefunden habe, so weit meine Warteschlange orientierte Fragen schnell beantwortet zu bekommen und kompetent. Das Forum ist hier: http://tech.groups.yahoo.com/group/nservicebus/

Quartz.Net ist ein Open Source Job-Scheduling-System.

Dies ist, was MSMQ konzipiert ist - mit Transaktionen Schlange stehen. Wenn das nicht für Sie arbeitet, überprüfen Sie das „Service Broker“ Feature von SQL Server aus - sein die „Warteschlange in einer SQL-Tabelle“, dass ‚csmba‘ in seiner Antwort beschreibt, aber es ist eine integrierte SQL Server-Komponente, schön verpackt und ausgesetzt für Ihren Gebrauch.

Ist WebSphere MQ (MQ Series) eine Option? Unterstützt die Transaktionsnachrichten.

Sie können Oracle-Funktion aussehen namens advanced Queuing

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top