Zum Hauptinhalt springen

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:

  1. Ein Client sendet einen Blockierungsbefehl, der Befehlsbehandler ruft daraufhin CollectionItemBroker.GetCollectionItemAsync auf
    1. Wenn die Hauptschleife des Brokers nicht läuft, wird sie gestartet und wartet auf das nächste Ereignis in ihrer Ereigniswarteschlange (brokerEventsQueue).
    2. Ein neues CollectionItemObserver-Objekt wird erstellt und ein Ereignis vom Typ NewObserverEvent wird in die Ereigniswarteschlange eingefügt.
    3. Der Befehlsbehandler wartet auf eines von zwei Ereignissen
      1. Ein Semaphorsignal, das von der Hauptschleife kommt, um zu benachrichtigen, dass ein Element gefunden wurde.
      2. Ein vom Client angegebener Timeout wurde erreicht.

Eingehender "Freigabe"-Befehl:

  1. Ein Client fügt ein Element in eine Collection ein, der Befehlsbehandler ruft daraufhin CollectionItemBroker.HandleCollectionUpdate auf\
    1. Wenn die Collection nicht von Clients beobachtet wird, gibt es nichts zu tun.
    2. Andernfalls wird ein neues Ereignis vom Typ CollectionUpdatedEvent in die Ereigniswarteschlange eingefügt.

Haupt-Broker-Schleife:

  1. Die Hauptschleife (CollectionItemBroker.Start) lauscht kontinuierlich auf eine AsyncQueue auf neue eingehende Ereignisse und ruft synchron HandleBrokerEvent für jedes neue Ereignis auf.\
    1. Für Ereignisse vom Typ NewObserverEvent wird InitializeObserver aufgerufen. InitializeObserver nimmt 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.
    2. Für Ereignisse vom Typ CollectionUpdatedEvent wird TryAssignItemFromKey aufgerufen. 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.

Entsorgte Sitzungen:

  1. Wenn eine RespServerSession, die einen aktiven Beobachter hat, entsorgt wird, ruft ihre Dispose-Methode CollectionItemBroker.HandleSessionDisposed auf, die wiederum den Beobachter aktualisiert und den Semaphor-Awaiter signalisiert, um zu stoppen. Sobald der Status des Beobachters auf SessionDisposed geändert wird, wird die Hauptschleife ihm kein Element mehr zuweisen.