PoppyDB — Ein MongoDB-kompatibler In-Memory-Server

Info

Datum: 11. 03. 2026 um 20:05:00

Schlagworte:

erstellt von Stephan Bösebeck

logged in

ADMIN


PoppyDB — Ein MongoDB-kompatibler In-Memory-Server

PoppyDB — Ein MongoDB-kompatibler In-Memory-Server

Warum "PoppyDB"?

Poppy ist die englische Mohnblume — und Morphium wird aus Mohn gewonnen. Der Name passt also perfekt: PoppyDB ist die leichtgewichtige Essenz, die aus dem Morphium-Projekt entstanden ist.

Was bisher als "MorphiumServer" tief im Morphium-Monolith steckte, ist jetzt ein eigenständiges Produkt. Aber warum die Extraktion?

Das Problem

Morphium ist ein MongoDB-Client für Java. Die meisten Nutzer brauchen genau das: eine komfortable Java-API für MongoDB. Allerdings schleppte de.caluga:morphium bisher den kompletten Server-Code mit — inklusive Netty und allem Drum und Dran. Das sind Dependencies, die 90% der Nutzer nie brauchen.

Gleichzeitig war der MorphiumServer mehr als nur ein Test-Werkzeug. Er implementiert das MongoDB Wire Protocol, unterstützt Replica Sets, hat eine eigene Leader Election und kann als vollwertiges Messaging-Backend dienen. Das verdient eine eigene Identität.

Was ist PoppyDB?

PoppyDB ist ein In-Memory-Server, der das MongoDB Wire Protocol spricht. Das bedeutet:

  • Jeder MongoDB-Client kann sich verbinden — mongosh, PyMongo, der offizielle Java Driver, oder natürlich Morphium
  • Kein MongoDB-Setup nötig — kein Replica Set konfigurieren, keine Datenbank installieren
  • Startet in Millisekunden
  • Ideal für Tests, Prototyping und als leichtgewichtiges Messaging-Backend

Als Test-Backend

Der klassische Use Case: Unit- und Integrationstests ohne echte MongoDB. Einfach als test-Dependency einbinden:

<dependency>
    <groupId>de.caluga</groupId>
    <artifactId>poppydb</artifactId>
    <version>6.2.0</version>
    <scope>test</scope>
</dependency>
PoppyDB server = new PoppyDB(27017);
server.start();

// Jetzt kann sich jeder MongoDB-Client verbinden
MorphiumConfig cfg = new MorphiumConfig("localhost", 27017, "testdb");
Morphium morphium = new Morphium(cfg);

// Tests laufen...

server.stop();

Keine Docker-Container, kein Testcontainers-Setup, keine externe Infrastruktur.

Als Messaging-Backend

Das ist vielleicht der spannendste Use Case. Morphium hat ein eingebautes Messaging-System, das auf MongoDB Change Streams basiert. Mit PoppyDB als Backend braucht man kein MongoDB für einfache Messaging-Szenarien:

// Server starten
PoppyDB server = new PoppyDB(27017);
server.start();

// Zwei Morphium-Instanzen als "Microservices"
Morphium sender = new Morphium(new MorphiumConfig("localhost", 27017, "messaging"));
Morphium receiver = new Morphium(new MorphiumConfig("localhost", 27017, "messaging"));

// Messaging starten
MorphiumMessaging senderMQ = sender.createMessaging();
MorphiumMessaging receiverMQ = receiver.createMessaging();
receiverMQ.start();

receiverMQ.addListenerForTopic("orders", (mq, msg) -> {
    System.out.println("Neue Bestellung: " + msg.getValue());
    return null;
});

// Nachricht senden
Msg order = new Msg("orders", "new_order", "{orderId: 42}");
senderMQ.sendMessage(order);

Das ist eine vollwertige Message Queue mit Topics, exklusiver Zustellung, Request/Response-Pattern — ohne Kafka, ohne RabbitMQ, ohne MongoDB. Nur eine Java-Dependency.

Der Clou: PoppyDB und Morphium Messaging sind aufeinander optimiert. Morphium erkennt PoppyDB explizit als Backend und passt seine Arbeitsweise an. Gleichzeitig hat PoppyDB serverseitig Optimierungen eingebaut, die speziell auf das Morphium-Messaging zugeschnitten sind. Bei einer echten MongoDB muss das Messaging auf Change Streams und Polling setzen — PoppyDB und Morphium können direkter und effizienter kommunizieren, weil beide Seiten die Messaging-Semantik verstehen. Das Ergebnis: niedrigere Latenz und weniger Overhead als mit einer „echten" MongoDB als Messaging-Backend.

Standalone als CLI

PoppyDB lässt sich auch als Standalone-Server starten:

java  -jar poppydb-6.2.0-cli.jar  --port 27017

Damit hat man einen MongoDB-kompatiblen Server, der sofort einsatzbereit ist. Praktisch für lokale Entwicklung, wenn man kein MongoDB installieren möchte.

Was kann PoppyDB?

  • MongoDB Wire Protocol — kompatibel mit Standard-MongoDB-Clients
  • Replica Set Simulation — inklusive Leader Election und Failover
  • Change Streams — Push-Benachrichtigungen bei Datenänderungen
  • Aggregation Pipeline — die wichtigsten Stages sind implementiert
  • Indizes — für schnelle Abfragen auch im In-Memory-Betrieb
  • Persistenz via Snapshots — periodische Dumps und automatisches Restore beim Start

Persistenz: Snapshots

PoppyDB ist In-Memory, aber Daten müssen nicht verloren gehen. Der eingebaute Dump-Mechanismus sichert alle Datenbanken periodisch in ein Verzeichnis und stellt sie beim nächsten Start automatisch wieder her:

java  -jar poppydb-6.2.0-cli.jar  --port 27017  --dump-dir  /var/poppydb/data  --dump-interval 300

Das sichert alle 5 Minuten den kompletten Zustand. Beim Shutdown wird ein finaler Dump geschrieben, beim nächsten Start automatisch restored. Programmatisch geht das natürlich auch:

PoppyDB server = new PoppyDB(27017);
server.setDumpDirectory(new File("/var/poppydb/data"));
server.setDumpIntervalMs(300_000)// alle 5 Minuten
server.start();

// Manueller Dump jederzeit möglich
server.dumpNow();

Kein WAL, kein Journaling — aber für Entwicklung, Tests und Messaging-Szenarien ist das völlig ausreichend.

Was kann PoppyDB (noch) nicht?

Ehrlichkeit gehört dazu: PoppyDB ist kein MongoDB-Ersatz für Produktion. Nicht alle MongoDB-Features sind implementiert, und die Performance-Charakteristik ist naturgemäß anders als bei einer festplattenbasierten Datenbank. Die Persistenz basiert auf Snapshots — zwischen zwei Dumps können also Daten verloren gehen.

Migration von MorphiumServer

Falls du bisher MorphiumServer / MorphiumServerCLI direkt verwendet hast:

VorherNachher
de.caluga.morphium.server.MorphiumServerde.caluga.poppydb.PoppyDB
de.caluga.morphium.server.MorphiumServerCLIde.caluga.poppydb.PoppyDBCLI
morphium-<version>-server-cli.jarpoppydb-<version>-cli.jar
Package de.caluga.morphium.server.*Package de.caluga.poppydb.*

Das Wire Protocol ist abwärtskompatibel — der Server sendet sowohl poppyDB: true als auch morphiumServer: true in der Hello-Response.

Ausblick

PoppyDB ist jetzt ein eigenständiges Modul und kann sich unabhängig von Morphium weiterentwickeln. Geplant sind unter anderem:

  • Bessere Aggregation-Pipeline-Unterstützung
  • Performance-Optimierungen für große Datasets
  • Persistenz-Optionen jenseits von Snapshots

Der Quellcode lebt im Morphium-Repository auf GitHub im poppydb/-Verzeichnis.

<dependency>
    <groupId>de.caluga</groupId>
    <artifactId>poppydb</artifactId>
    <version>6.2.0</version>
</dependency>