Start · Sprachen · PHP · Referenz · MongoDB\Driver\TopologyDescription

MongoDB\Driver\TopologyDescription

Klasse

Beschreibt die aktuelle Topologie einer MongoDB-Serverumgebung (z. B. Einzelserver, Replica Set oder Sharded Cluster).

seit PHP 1.13.0 Kategorie: db

Signatur

final class MongoDB\Driver\TopologyDescription

Beschreibung

MongoDB\Driver\TopologyDescription ist eine unveränderliche (immutable) Klasse, die den aktuellen Zustand der erkannten MongoDB-Topologie repräsentiert. Sie enthält Informationen über den Topologietyp sowie die zugehörigen Server, und wird vom Treiber beim Überwachen der Serverumgebung erzeugt.

Instanzen dieser Klasse werden typischerweise im Kontext von SDAM-Ereignissen (Server Discovery and Monitoring) verwendet, zum Beispiel über das Interface MongoDB\Driver\Monitoring\TopologyChangedEvent. Sie können nicht direkt per new instanziiert werden.

Mit getType() lässt sich der erkannte Topologietyp als String abrufen, z. B. Unknown, Single, ReplicaSetWithPrimary, ReplicaSetNoPrimary oder Sharded. Mit getServers() kann man alle bekannten Server als Array von MongoDB\Driver\ServerDescription-Objekten abrufen.

Diese Klasse ist besonders nützlich für Monitoring-Zwecke, etwa um in einer Hochverfügbarkeitsumgebung festzustellen, wann ein Primary ausfällt oder wann ein Replica-Set vollständig verfügbar ist.

Beispiele

Topologietyp und Server über ein SDAM-Ereignis auslesen

<?php
use MongoDB\Driver\Monitoring\TopologyChangedEvent;
use MongoDB\Driver\Monitoring\SDAMSubscriber;
use MongoDB\Driver\Manager;

class TopologyLogger implements SDAMSubscriber
{
    public function topologyOpened(\MongoDB\Driver\Monitoring\TopologyOpeningEvent $event): void {}
    public function topologyClosed(\MongoDB\Driver\Monitoring\TopologyClosedEvent $event): void {}

    public function topologyChanged(TopologyChangedEvent $event): void
    {
        $newDescription = $event->getNewDescription();

        echo "Topologietyp: " . $newDescription->getType() . PHP_EOL;

        foreach ($newDescription->getServers() as $server) {
            echo " - Server: " . $server->getHost() . ":" . $server->getPort()
                . " (Typ: " . $server->getType() . ")" . PHP_EOL;
        }
    }

    public function serverChanged(\MongoDB\Driver\Monitoring\ServerChangedEvent $event): void {}
    public function serverClosed(\MongoDB\Driver\Monitoring\ServerClosedEvent $event): void {}
    public function serverOpened(\MongoDB\Driver\Monitoring\ServerOpeningEvent $event): void {}
    public function serverHeartbeatFailed(\MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent $event): void {}
    public function serverHeartbeatStarted(\MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent $event): void {}
    public function serverHeartbeatSucceeded(\MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent $event): void {}
}

$manager = new Manager('mongodb://localhost:27017');
\MongoDB\Driver\Monitoring\addSubscriber(new TopologyLogger());

// Eine Datenbankoperation auslösen, damit der Treiber die Topologie erkennt
$manager->selectDatabase('admin')->command(['ping' => 1]);
Topologietyp: Single - Server: localhost:27017 (Typ: Standalone)

Prüfen, ob ein Replica-Set-Primary vorhanden ist

<?php
use MongoDB\Driver\Monitoring\TopologyChangedEvent;
use MongoDB\Driver\Monitoring\SDAMSubscriber;
use MongoDB\Driver\TopologyDescription;

class PrimaryWatcher implements SDAMSubscriber
{
    public function topologyChanged(TopologyChangedEvent $event): void
    {
        $desc = $event->getNewDescription();
        $type = $desc->getType();

        if ($type === TopologyDescription::TYPE_RS_WITH_PRIMARY) {
            echo "Replica Set hat einen Primary – System ist vollständig verfügbar." . PHP_EOL;
        } elseif ($type === TopologyDescription::TYPE_RS_NO_PRIMARY) {
            echo "Warnung: Kein Primary im Replica Set verfügbar!" . PHP_EOL;
        }
    }

    public function topologyOpened(\MongoDB\Driver\Monitoring\TopologyOpeningEvent $event): void {}
    public function topologyClosed(\MongoDB\Driver\Monitoring\TopologyClosedEvent $event): void {}
    public function serverChanged(\MongoDB\Driver\Monitoring\ServerChangedEvent $event): void {}
    public function serverClosed(\MongoDB\Driver\Monitoring\ServerClosedEvent $event): void {}
    public function serverOpened(\MongoDB\Driver\Monitoring\ServerOpeningEvent $event): void {}
    public function serverHeartbeatFailed(\MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent $event): void {}
    public function serverHeartbeatStarted(\MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent $event): void {}
    public function serverHeartbeatSucceeded(\MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent $event): void {}
}

$manager = new \MongoDB\Driver\Manager('mongodb://rs0/localhost:27017,localhost:27018,localhost:27019');
\MongoDB\Driver\Monitoring\addSubscriber(new PrimaryWatcher());
$manager->selectDatabase('admin')->command(['ping' => 1]);
Replica Set hat einen Primary – System ist vollständig verfügbar.

// Wichtig · Fallstricke

Nicht direkt instanziierbar: TopologyDescription ist final und kann nicht erweitert oder manuell per new erzeugt werden. Instanzen werden ausschließlich vom Treiber intern erstellt und über SDAM-Ereignisse bereitgestellt.

Verfügbare Typkonstanten (ab mongodb-Extension 1.13.0):
TopologyDescription::TYPE_UNKNOWN, TYPE_SINGLE, TYPE_RS_WITH_PRIMARY, TYPE_RS_NO_PRIMARY, TYPE_SHARDED, TYPE_LOAD_BALANCED.

Nebenläufigkeit: In lang laufenden Prozessen (z. B. PHP-FPM oder ReactPHP) können SDAM-Ereignisse asynchron ausgelöst werden. Der Zustand in TopologyDescription repräsentiert immer nur einen Snapshot zum Zeitpunkt des Ereignisses.