2009-04-23 4 views
4

Gibt es bekannte Best Practices zum Synchronisieren von Aufgaben in einer Serverfarm? Zum Beispiel, wenn ich eine forumbasierte Website habe, die auf einer Serverfarm läuft, und es gibt zwei Moderatoren, die versuchen, etwas zu tun, was das Schreiben in mehrere Tabellen in der Datenbank erfordert, und die Anforderungen dieser Moderatoren werden von verschiedenen Servern auf dem Server gehandhabt Farm, wie kann man einige Sperrfunktionen implementieren, um sicherzustellen, dass sie diese Aktion nicht gleichzeitig auf demselben Objekt ausführen können?Wie wird das Sperren in einer Serverfarm implementiert?

Bisher Ich denke an eine Tabelle in der Datenbank zu synchronisieren, z.B. Überprüfen Sie die ID des Elements in der Tabelle, wenn sie nicht vorhanden ist, fügen Sie sie ein und fahren Sie fort, andernfalls kehren Sie zurück. Wahrscheinlich könnte auch ein geteilter Cache dafür verwendet werden, aber ich benutze dies momentan nicht.

Irgendein anderer Weg?

By the way, ich bin mit MySQL als meine Datenbank-Backend.

+0

Es gibt mehrere Anfragen, die versuchen, gleichzeitig auf den Datenbankserver zuzugreifen. Dass sie sich auf einem anderen Server befinden, ändert sich nicht wirklich. – jfclavette

+0

OK, aber sie wirken sich gleichzeitig auf mehrere Datensätze aus. Ich möchte nicht, dass eine andere Anforderung dieselben Datensätze betrifft, während die erste Anforderung noch aktiv ist.In einfachen Worten, ich möchte etwas wie das Lock-Schlüsselwort in C# haben, möchte es aber auf eine verteilte Weise funktionieren. –

Antwort

1

Wenn sich der gesamte Status in der (zentralen) Datenbank befindet, sollten die Datenbanktransaktionen das für Sie erledigen.

Siehe http://en.wikipedia.org/wiki/Transaction_(database)

+0

Soweit ich verstehe, werden Transaktionen verwendet, um sicherzustellen, dass alle Anweisungen in der Transaktion ausgeführt werden oder keine von ihnen. Wie ist das mit der Verriegelung oder Gewindesicherheit gemeint? Sperrt die Transaktion alle betroffenen Tabellen (die an der Transaktion beteiligten Tabellen) oder sperrt/blockiert andere Transaktionen, bis sie abgeschlossen ist? –

2

Sie können einen verteilten Sperrdienst wie Zookeeper untersuchen. Es handelt sich um eine Neuimplementierung eines Google-Diensts, der die Koordination von verteilten Ressourcen mit hoher Geschwindigkeit für Anwendungen ermöglicht. Ich weiß nicht, wie einfach es wäre, in eine Web-App zu integrieren.

0

eine Tabelle von Sperren zu haben, ist ein OK Weg, es ist einfach und funktioniert zu tun.

Sie können auch den Code als Dienst auf einem Server haben, eher ein SOA-Ansatz.

Sie können auch das Feld TimeStamp mit Transaktionen verwenden. Wenn sich der Zeitstempel seit dem letzten Erhalt der Daten geändert hat, können Sie die Transaktion rückgängig machen. Wenn also jemand zuerst ankommt, haben sie Priorität.

4

Ihre Frage impliziert Datenebene Concurrency Control - in diesem Fall die Steuerung des gemeinsamen Zugriffs Mechanismen des RDBMS verwenden.

Das hilft Ihnen nicht, wenn Sie später Aktionen auf Anwendungsebene steuern möchten, die nicht unbedingt eins zu eins einer Datenentität zugeordnet werden (z. B. Zugriff auf Tabellensätze). Die allgemeine Lösung ist ein Reverse-Proxy-Server, der die Semantik auf Anwendungsebene versteht und bei Bedarf entsprechend serialisiert. (Das wird sich negativ auf die Verfügbarkeit auswirken.)

Es würde wahrscheinlich auch nicht schaden, das CAP-Theorem zu lesen!

0

Es kann für Sie irrelevant sein, weil die Frage alt ist, aber es kann immer noch nützlich für andere sein, also werde ich es trotzdem posten.

Sie können eine db-Abfrage "SELECT FOR UPDATE" für ein Sperrobjekt verwenden, sodass Sie die db tatsächlich zum Erreichen des Sperrmechanismus verwenden.

wenn Sie ORM verwenden, können Sie das auch tun. Beispiel: In Nhibernate können Sie Folgendes tun:

session.Lock(Member, LockMode.Upgrade); 
Verwandte Themen