Die parallele Verarbeitung von Datenbank-Warteschlange
-
05-07-2019 - |
Frage
Es gibt kleines System, in dem eine Datenbanktabelle als Warteschlange auf MSSQL 2005. Eine Reihe von Anwendungen auf diese Tabelle zu schreiben, und eine Anwendung ist das Lesen und die Verarbeitung in einer FIFO-Weise.
muss ich es ein wenig weiter fortgeschritten zu können, machen ein verteiltes System schaffen, in dem mehrere Verarbeitungs Anwendung ausgeführt werden kann. Das Ergebnis sollte sein, dass 2-10 Verarbeitungsanwendung sollte in der Lage zu laufen und sie sollten sich gegenseitig bei der Arbeit nicht stören.
Meine Idee ist es, die Queue-Tabelle mit einer Reihe zeigt, dass ein Prozess arbeitet bereits auf ihn zu verlängern. Die Verarbeitungsanwendung wird zuerst die Tabelle aktualisieren, damit idetifyer ist, und dann für die aktualisierten Datensätze fragt.
So etwas wie folgt aus:
start transaction
update top(10) queue set processing = 'myid' where processing is null
select * from processing where processing = 'myid'
end transaction
Nach der Verarbeitung setzt die Verarbeitung Spalte der Tabelle auf etwas anderes, wie ‚erledigt‘, oder was auch immer.
Ich habe drei Fragen zu diesem Ansatz.
Erstens: Kann diese Arbeit in dieser Form
Zweitens: Wenn es funktioniert, ist es effektiv? Haben Sie noch andere Ideen haben, eine solche Verteilung zu erstellen?
Drittens: In der Verriegelungs MSSQL ist Reihe basiert, aber nachdem eine Menge von Zeilen gesperrt ist, wird die Sperre für die gesamte Tabelle erweitert. So ist die zweite Anwendung kann nicht darauf zugreifen, bis die erste Anwendung entbindet die Transaktion nicht. Wie groß kann die Auswahl (oben x) sein, um nicht die gesamte Tabelle zu sperren, nur Zeilensperren erstellen?
Lösung
Das wird funktionieren, aber Sie werden wahrscheinlich finden Sie in Sperrung oder Deadlocks werden laufen, wo mehrere Prozesse versuchen und lesen / aktualisieren, um die gleichen Daten. Ich schrieb ein Verfahren für einen unserer Systeme genau dies zu tun, die einige interessante Verriegelungs Semantik verwendet diese Art der Sache, um sicherzustellen, läuft ohne Blockierung oder Deadlocks, beschrieben hier .
Andere Tipps
Dieser Ansatz scheint mir vernünftig, und ist ähnlich, die ich in der Vergangenheit verwendet haben -. Erfolgreich
Außerdem wird die Zeile / Tabelle nur gesperrt werden, während die Aktualisierung und Auswahl-Operationen stattfinden, so dass ich bezweifle, dass die Reihe vs Tabelle Frage ist wirklich ein wichtiger Aspekt.
Wenn der Verarbeitungsaufwand für Ihre Anwendung ist so gering, unbedeutend ist, würde ich den „top“ Wert niedrig halten -. Vielleicht nur 1. Natürlich, die auf den Details Ihrer Anwendung hängt ganz
Nachdem alles gesagt, dass ich bin kein DBA, und so wird es auch in irgendwelchen mehr Experten Antworten interessiert sein
In Bezug auf Ihre Frage zu sperren. Sie können einen Sperr Hinweis verwenden, um es zu zwingen nur Zeilen sperren
update mytable with (rowlock) set x=y where a=b
Das größte Problem bei diesem Ansatz ist, dass Sie die Anzahl der ‚Updates‘ erhöhen, um den Tisch. Versuchen Sie dies mit nur einem Prozess raubend (Update + löschen) und andere Daten in der Tabelle einfügen, und Sie werden feststellen, dass bei rund einer Million Datensätze, es beginnt zu bröckeln.
Ich würde eher einen Verbraucher für die DB habe und Nachrichtenwarteschlangen verwenden, um die Verarbeitung von Daten an anderen Verbrauchern zu liefern.