Generische Antwort
Semaphor ist eine Ressourcenzuweisungstechnik zum Verwalten von Deadlocks und Race-Bedingungen über Prioritätswarteschlangen. Metaphorisch ausgedrückt, Sie können 3 Fahrräder mieten. Angenommen, Sie mieten es nach dem Prinzip "Wer zuerst kommt, mahlt zuerst". Wenn Sie also alle Ihre 3 Fahrräder gemietet haben und eine vierte Person dies anfordert, muss sie warten, bis eines von ihnen das Fahrrad zurückgebracht hat. Es besteht die Möglichkeit, dass Sie das Fahrrad für jemanden reservieren, jemand ein bereits reserviertes Fahrrad storniert und so weiter. Ähnlich wie bei Prozessen, die einige Ressourcen erwerben möchten, werden Semaphoren verwendet.
Bei einem verteilten Semaphor können mehrere Ressourcen vorhanden sein, auf die mehrere Prozesse zugreifen können. Angenommen, ein Server hostet eine Anwendung und kann mehrere Instanzen davon hosten, und der Benutzer kann die Anwendung verwenden, wenn sie kostenlos ist. Der Server sei S1, S2, .. Sn, während die Anwendung A1, A2, ... An und die Benutzer U1, U2, ... Un sind. Wenn der erste Server also drei Instanzen der Anwendung hosten könnte, würde er als S1A1, S1A2, S1A3 bezeichnet. Nehmen Sie zum besseren Verständnis auch die Anwendungsinstanzen als Slots oder Boxen an. Ein Steckplatz gilt als leer, wenn er frei und voll ist, wenn er belegt ist. In diesem Fall wird die folgende Methode vorgeschlagen
- Benutzer fordert die Anwendung an
- Die Anforderung wird an eine Prioritätswarteschlange übergeben.
- Die Warteschlange führt einen kontinuierlichen Hintergrundprozess aus, um nach freien Slots zu suchen. Sobald ein freier Slot gefunden wurde, leitet er die Anforderung an die Anwendung weiter, um die Verarbeitung zu starten
- Sobald ein Slot die Anfrage erhält, markieren sie sich als beschäftigt und beginnen mit der Verarbeitung und markieren sich als frei, wenn sie die Verarbeitung abgeschlossen haben
- Die Slots senden ihren Status regelmäßig an die Warteschlange, sodass die Warteschlange die Anforderungen weiterleiten kann, sobald ein Slot frei wird
Empfohlene Ressourcen
- Dieses Modell basiert auf zentraler Nachrichtenvermittlung. Die Warteschlange, die die Anforderung verarbeitet, sollte immer verfügbar sein. Es kann auch ein Modell ohne Makler geben, das auf andere Weise implementiert werden könnte
- Semaphor-Programmierung auf Wikipedia
- Das kleine Buch über Semaphoren ist eine hervorragende Ressource, die frei verfügbar ist
- Semaphor basiert auf einem Shared-Memory-Modell. Actor Model würde einen neuen Einblick geben, um dieses Problem auf andere Weise zu lösen
Spezifische Antwort auf die Frage im Kontext
Wenn ich mir den Code anschaue, bevorzuge ich die klassische Version eines Semaphors. Java hat ein eingebautes Semaphor- Paket, um dies zu tun, und Sie können einfach darauf aufbauen.
Insbesondere möchte ich wissen, was ein gutes Ziel für den ersten Schritt oder ein einfaches Subsystem ist, das ich implementieren kann.
Angenommen, nur eine Instanz der Anwendung sollte im LAN ausgeführt werden
- Verwenden Sie das oben vorgeschlagene Paket
- Erstellen Sie das Semaphor mit einem integrierten Warteschlangenmechanismus (ähnlich einem Stapel) und implementieren Sie es als Server
- Wenn ein Benutzer die Anwendung startet, sucht er nach dem Semaphor, verringert die Anzahl (in diesem Fall nur 0, da nur eine einzige Instanz zulässig sein soll) und gibt dem Benutzer Zugriff auf die Anwendung
- Wenn ein anderer Benutzer die Anwendung startet, sucht er nach dem Semaphor, da es 0 ist, stellt den Benutzer in die Warteschlange und gibt dem Benutzer eine Nachricht, dass die Anwendung beschäftigt ist
- Wenn der erste Benutzer die Anwendung verlässt, wird das Semaphor inkrementiert, die Ressource wird verfügbar, der Benutzer wird informiert und kann nun die Anwendung starten.
- Das Semaphor kann als eigenständiger Server (möglicherweise mit einer einfachen Webschnittstelle) implementiert werden, der mit der Anwendung gekoppelt werden kann.
Die folgenden Einschränkungen sind erwägenswert
- Warteschlangen können vollständig geleert oder die Priorität geändert werden
- Wenn Sie es mit der Anwendung als Server koppeln, muss sich nur eine Version des Servers im LAN befinden
- Bereiten Sie sich auf Abstürze oder unbeaufsichtigte Nachrichtenwarteschlangen vor (Benutzeranforderungszugriff, jedoch nicht verfügbar, wenn die Anwendung kostenlos ist)
Zum besseren Verständnis würde ich wahrscheinlich Folgendes vorschlagen
- Folgen Sie diesem Link zum besseren Verständnis
- Versuchen Sie es mit SCALA . Sie können alle vorhandenen JAVA-Bibliotheken verwenden und erhalten eine gute Parallelität
- Schauen Sie sich ZMQ an . Dies kann die Option sein, wenn Sie den gesamten Prozess in eine separate Messaging-Anwendung abstrahieren, die mit den Ressourcen interagiert
- Lesen Sie mehr über das AutoCAD-Lizenzierungssystem (es implementiert ein Lizenzmodell, das nur wenigen Ihrer Anforderungen entspricht).
BEARBEITEN
Antwort vollständig bearbeitet, da die ursprüngliche Antwort auf einer viel breiteren Perspektive basiert