Collection Broker
Die Rolle des Collection Brokers ist es, Blockierungsbefehle für Collections in Garnet zu erleichtern.
Ein Blockierungsbefehl ist ein Befehl, der sofort zurückkehrt, wenn ein Element in einer Collection verfügbar ist, oder der den Client blockiert, bis ein Element verfügbar ist (siehe: BLPOP, BLMOVE etc.).
Der Broker führt seine Hauptschleife in einem dedizierten Task aus, wann immer aktive Clients auf Collection-Elemente warten.
Logischer Ablauf
Eingehender Blockierungsbefehl:
- Ein Client sendet einen Blockierungsbefehl, der Befehlsbehandler ruft daraufhin
CollectionItemBroker.GetCollectionItemAsyncauf- Wenn die Hauptschleife des Brokers nicht läuft, wird sie gestartet und wartet auf das nächste Ereignis in ihrer Ereigniswarteschlange (
brokerEventsQueue). - Ein neues
CollectionItemObserver-Objekt wird erstellt und ein Ereignis vom TypNewObserverEventwird in die Ereigniswarteschlange eingefügt. - Der Befehlsbehandler wartet auf eines von zwei Ereignissen
- Ein Semaphorsignal, das von der Hauptschleife kommt, um zu benachrichtigen, dass ein Element gefunden wurde.
- Ein vom Client angegebener Timeout wurde erreicht.
- Wenn die Hauptschleife des Brokers nicht läuft, wird sie gestartet und wartet auf das nächste Ereignis in ihrer Ereigniswarteschlange (
Eingehender "Freigabe"-Befehl:
- Ein Client fügt ein Element in eine Collection ein, der Befehlsbehandler ruft daraufhin
CollectionItemBroker.HandleCollectionUpdateauf\- Wenn die Collection nicht von Clients beobachtet wird, gibt es nichts zu tun.
- Andernfalls wird ein neues Ereignis vom Typ
CollectionUpdatedEventin die Ereigniswarteschlange eingefügt.
Haupt-Broker-Schleife:
- Die Hauptschleife (
CollectionItemBroker.Start) lauscht kontinuierlich auf eineAsyncQueueauf neue eingehende Ereignisse und ruft synchronHandleBrokerEventfür jedes neue Ereignis auf.\- Für Ereignisse vom Typ
NewObserverEventwirdInitializeObserveraufgerufen.InitializeObservernimmt ein Array von Schlüsseln und prüft die Collection-Werte auf verfügbare Elemente in der Reihenfolge, in der sie vom Client angegeben wurden. Wenn ein Element gefunden wird, wird der Beobachter aktualisiert, was das Ergebnis setzt und den Semaphor signalisiert, um den wartenden Thread freizugeben. Wenn kein Element gefunden wird, wird der Beobachter zur Beobachterwarteschlange jedes Schlüssels hinzugefügt. - Für Ereignisse vom Typ
CollectionUpdatedEventwirdTryAssignItemFromKeyaufgerufen. Diese Methode holt die Beobachterwarteschlange des Schlüssels und versucht, das nächste verfügbare Element aus der unter dem Schlüssel gespeicherten Collection dem nächsten Beobachter zuzuweisen. Wenn ein verfügbares Element tatsächlich gefunden wurde, wird der Beobachter aktualisiert, was das Ergebnis setzt und den Semaphor signalisiert, um den wartenden Thread freizugeben.
- Für Ereignisse vom Typ
Entsorgte Sitzungen:
- Wenn eine
RespServerSession, die einen aktiven Beobachter hat, entsorgt wird, ruft ihreDispose-MethodeCollectionItemBroker.HandleSessionDisposedauf, die wiederum den Beobachter aktualisiert und den Semaphor-Awaiter signalisiert, um zu stoppen. Sobald der Status des Beobachters aufSessionDisposedgeändert wird, wird die Hauptschleife ihm kein Element mehr zuweisen.