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
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:
<groupId>de.caluga</groupId>
<artifactId>poppydb</artifactId>
<version>6.2.0</version>
<scope>test</scope>
</dependency>
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:
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:
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:
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:
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:
| Vorher | Nachher |
|---|---|
de.caluga.morphium.server.MorphiumServer | de.caluga.poppydb.PoppyDB |
de.caluga.morphium.server.MorphiumServerCLI | de.caluga.poppydb.PoppyDBCLI |
morphium-<version>-server-cli.jar | poppydb-<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.
<groupId>de.caluga</groupId>
<artifactId>poppydb</artifactId>
<version>6.2.0</version>
</dependency>