Verteilte Gleichzeitigkeitskontrolle
Ich habe diese für ein paar Tage jetzt, und ich habe mehrere Lösungen, aber keiner von Ihnen unglaublich einfach oder leicht. Das problem ist im Grunde so aus: Wir haben ein cluster von 10 Maschinen, von denen jede die gleiche software auf einem Multithread-ESB-Plattform. Ich kann Parallelitätsprobleme zwischen threads auf der gleichen Maschine ziemlich leicht, was aber über die Parallelität auf die gleichen Daten auf unterschiedlichen Rechnern?
Im wesentlichen die software empfängt Anfragen zu ernähren, den Daten eines Kunden von einem Geschäft zum anderen über web services. Dem Kunden ist jedoch der möglicherweise oder möglicherweise nicht vorhanden, noch auf dem anderen system. Wenn nicht, schaffen wir es über eine web-service-Methode. So Bedarf es einer Art von test-and-set, aber ich brauche ein semaphor eine Art zu sperren der anderen Maschinen verursacht race conditions. Ich habe Situationen vor, in denen ein remote Kunden erstellt wurde zweimal für einen einzelnen lokalen Kunden, was nicht wirklich wünschenswert.
Lösungen habe ich schon gespielt konzeptionell sind:
- Nutzung unserer fehlertolerante shared file system zu schaffen, "lock" - Dateien, welche überprüft, ob durch jede Maschine je nach Kunden -
- Mithilfe einer speziellen Tabelle in unserer Datenbank, und sperren Sie die gesamte Tabelle, um Sie zu tun, eine "test-and-set" für eine Sperre Datensatz.
- Verwendung von Terrakotta, eine open-source-server-software, die hilft bei der Skalierung, sondern verwendet eine hub-and-spoke-Modell.
- Mit EHCache, die für synchrone Replikation von meinem in-memory "sperren."
Ich kann mir nicht vorstellen, dass ich die einzige person, die jemals hatte diese Art von problem. Wie hast du es lösen? Hast du etwas Kochen im Haus, oder haben Sie eine Lieblings-3rd-party-Produkt?
InformationsquelleAutor der Frage Bob Gettys | 2008-09-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
möchten Sie vielleicht zu prüfen, mit Hazelcast verteilte sperren. Super lite und einfach.
Hazelcast - Distributed Queue, Map, Set, List, Lock
InformationsquelleAutor der Antwort
Verwenden wir Terrakotta, so möchte ich zu Stimmen.
Habe ich Hazelcast und es sieht aus wie eine weitere vielversprechende Technologie, aber nicht für ihn Stimmen, da habe ich nicht verwendet, und zu wissen, dass es verwendet ein P2P system basierend auf seiner gehört, würde ich wirklich nicht Vertrauen, dass es für große Skalierung muss.
Aber ich habe auch gehört, der Tierpfleger, der kam aus Yahoo, und bewegt sich unter der Hadoop-Dach. Wenn Sie abenteuerlich sind, die versuchen, einige neue Technologie-das hat wirklich viel Versprechen, da es sehr schlank und flink, Fokussierung auf nur Koordination. Ich mag die vision und Verheißung, aber könnte es auch noch grün.
InformationsquelleAutor der Antwort fern
Terracotta ist näher an eine "abgestufte" Modell - alle client-Anwendungen, sprechen Sie mit einem Terracotta Server-Array (und vor allem für die Skala, die Sie nicht miteinander sprechen). Die Terracotta Server-Array ist in der Lage Clusterbildung sowohl im Umfang als auch die Verfügbarkeit (gespiegelt, nach Verfügbarkeit und gestreifte, für die Skala).
In jedem Fall, wie Sie wahrscheinlich wissen, Terrakotta bietet Ihnen die Möglichkeit, um auszudrücken, Parallelität über den cluster auf die gleiche Weise tun, in einer einzigen JVM durch die Verwendung von POJO synchronized/wait/notify oder durch die Verwendung von java.util.gleichzeitige primitiven wie ReentrantReadWriteLock, CyclicBarrier, AtomicLong, FutureTask und so weiter.
Gibt es eine Menge einfache Rezepte demonstrieren die Verwendung dieser primitive in der Terrakotta-Kochbuch.
Als Beispiel, ich werde nach dem ReentrantReadWriteLock Beispiel (Hinweis: es gibt keine "Terracotta" - version der lock - verwenden Sie einfach normalen Java ReentrantReadWriteLock)
InformationsquelleAutor der Antwort Taylor Gautier
Empfehle ich die Nutzung Redisson. Es führt über 30 verteilte Datenstrukturen und Dienste, einschließlich
java.util.Lock
. Beispiel:InformationsquelleAutor der Antwort Nikita Koksharov
Ich wollte Hinweise zur Verwendung von memcached als eine sehr schnelle, verteilte RAM-Speicher für die Aufbewahrung von Protokollen; aber es scheint, dass EHCache ist ein ähnliches Projekt, aber mehr java-centric.
Entweder ist der Weg zu gehen, solange Sie sicher sind, zu verwenden Atomare updates (memcached unterstützt Sie, weiß nicht, über EHCache). Es ist bei weitem die am besten skalierbare Lösung.
Verbundene Datenpunkt verwendet Google 'Mollig', eine schnelle, RAM-based distributed lock Speicherung als Stamm mehrerer Systeme, unter Ihnen BigTable.
InformationsquelleAutor der Antwort Javier
Ich getan haben eine Menge Arbeit mit Kohärenz, die es erlaubt, mehrere Ansätze für die Implementierung einer verteilten sperren. Der naive Ansatz wurde auf Wunsch sperren, um das gleiche logische Objekt, auf alle teilnehmenden Knoten. In Kohärenz Bedingungen war dies das sperren eines Schlüssels auf einem Replizierten Cache. Dieser Ansatz ist nicht skalierbar, denn der Netzwerkverkehr steigt Linear, wie Sie Knoten hinzufügen. Eine intelligentere Weise zu nutzen, um einen Verteilten Cache, wobei jeder node im cluster ist natürlich verantwortlich für einen Teil des Schlüsselraums, also die Verriegelung einen Schlüssel in solch einem cache immer mit dabei, die Kommunikation mit höchstens einem Knoten. Könnten Sie Rollen Sie Ihre eigenen Ansatz, der auf diese Idee, oder besser noch, Holen Sie sich die Kohärenz. Es ist wirklich die Skalierbarkeit toolkit Ihrer Träume.
Ich möchte hinzufügen, dass jeder halbwegs anständige multi-Knoten-Netz-basierten locking-Mechanismus hätte um vernünftig zu anspruchsvoll, um richtig handeln im Falle von Netzwerk-Fehler.
InformationsquelleAutor der Antwort Craig Day
Nicht sicher, ob ich verstehe den ganzen Zusammenhang, aber es klingt wie Sie haben 1 single Datenbank sichern? Warum nicht nutzen Sie die Datenbank sperren: wenn Sie den Kunden einen einzigen EINFÜGEN, dann ist diese Aussage allein kann dienen als eine Sperre, da die Datenbank abzulehnen einen zweiten EINFÜGEN, dass würde gegen eine Ihrer Vorgaben (z.B. die Tatsache, dass der name des Kunden ist einzigartig, zum Beispiel).
Wenn das "einsetzen eines Kunden" - operation ist nicht atomar und ist eine Gruppe von Aussagen, dann würde ich einführen (oder Verwendung) eines ersten EINFÜGEN, das schafft einige einfache basic-Datensatz identifizieren Sie Ihre Kunden (mit der erforderlichen Eindeutigkeit Einschränkungen) und dann tun alle anderen inserts/updates in der gleichen Transaktion. Wieder wird die Datenbank kümmern Konsistenz und der gleichzeitigen änderungen führt eine von Ihnen versagt.
InformationsquelleAutor der Antwort Boris Terzic
Habe ich ein einfaches RMI-service mit zwei Methoden: sperren und freigeben. beide Methoden nehmen den Schlüssel (mein Datenmodell verwendet UUIDs, die als pk so, dass war auch die sperren-Taste).
RMI ist eine gute Lösung für dieses, weil es zentralisiert. Sie können nicht mit EJBs (specialially in einem cluster, wie Sie nicht wissen, auf welcher Maschine Ihr Anruf landet). plus, es ist leicht.
es funktionierte für mich.
InformationsquelleAutor der Antwort entzik
Wenn Sie können Ihre load balancing, so dass Anträge für einen einzelnen Kunden immer das bekommen, abgebildet auf dem gleichen server, dann können Sie handhaben, über die lokale Synchronisation. Zum Beispiel, nehmen Sie Ihre Kunden-ID mod 10 zu finden, welche von der 10-Knoten zu verwenden.
Selbst wenn Sie nicht wollen, tun dies im Allgemeinen Fall die Knoten könnten proxy zu jedem anderen für diese spezielle Art von Anfrage.
Vorausgesetzt die Benutzer sind homogen genug (D. H., wenn Sie haben eine Tonne von Ihnen), dass Sie nicht erwarten, dass hot-spots, pop-up, wo ein Knoten überlastet wird, sollte dies noch skalieren ziemlich gut.
InformationsquelleAutor der Antwort Jonathan
Könnte Sie auch interessieren Cacheonix für verteilte sperren. Anders als alles, was sonst hier erwähnt Cacheonix Unterstützung ReadWrite sperren mit der Sperre von Lesen zu schreiben bei Bedarf:
Vollständige Offenlegung: ich bin ein Cacheonix Entwickler.
InformationsquelleAutor der Antwort Slava Imeshev
Da Sie bereits den Anschluss an eine Datenbank, bevor Sie einen anderen hinzufügen infra Stück, nehmen Sie einen Blick auf JdbcSemaphorees ist einfach zu verwenden:
Es ist Teil spf4j Bibliothek.
InformationsquelleAutor der Antwort user2179737
Zurück in den Tag, würden wir die Verwendung eines bestimmten "lock server" auf dem Netzwerk zu handhaben. Bleh.
Ihre Datenbank-server haben könnten Ressourcen gezielt für diese Art der Sache. MS-SQL-Server-Anwendung sperren nutzbar durch die sp_getapplock/sp_releaseapplock Verfahren.
InformationsquelleAutor der Antwort Clinton Pierce
Entwickeln wir eine open source, distributed synchronization framework, derzeit DistributedReentrantLock und DistributedReentrantReadWrite Sperre wurde implementiert, aber noch in der Test-und refactoring-phase. In unserem Architektur-lock-keys sind aufgeteilt in Eimern, und jeder Knoten ist verantwortlich für eine bestimmte Anzahl von Eimern. Also effektiv für eine erfolgreiche lock-Anfragen, es ist nur ein Netzwerk-Anfrage. Wir sind auch mit AbstractQueuedSynchronizer-Klasse als lokale lock-Zustand, so dass alle fehlgeschlagen Sperranforderungen lokal behandelt, dies reduziert Netzwerk-trafic.
Wir sind mit JGroups (http://jgroups.org) für die Kommunikation in der Gruppe und hessische für die Serialisierung.
für details, überprüfen Sie bitte http://code.google.com/p/vitrit/.
Bitte senden Sie mir Ihr wertvolles feedback.
Kamran
InformationsquelleAutor der Antwort Kamran