Versuchsdurchführung
Versuch Teil 1 - Sender-/Empfänger Netzwerk
Vorbereitung
Für den Versuch 1 wurde ein Setup aus mehreren Docker-Containern erstellt. Das Projektverzeichnis enthielt die folgenden Komponenten:
- Eine
docker-compose.yml
zur Definition aller Dienste, Netzwerke und Volumes - Ein eigener Container für den MQTT-Broker (
mosquitto
) - Ein Sender-Container, der Nachrichten über MQTT verschickt (
mqtt-sender
) - Drei Empfänger-Container, die dieselben Nachrichten empfangen und anzeigen (
mqtt-receiver
) - Ein Logger-Container, der empfangene Nachrichten in eine PostgreSQL-Datenbank schreibt (
mqtt-logger
) - Eine Datenbank-Instanz (
postgres_db
) - Zwei Docker-Netzwerke:
mqtt_network
(für Kommunikation über MQTT) unddb_network
(für Datenbankanbindung) - Eine einfache Mosquitto-Konfigurationsdatei
Durchführung
Start der Umgebung
Das gesamte Setup wurde über den Befehl docker-compose up --build -d
im Hauptverzeichnis gestartet.
Dabei wurden alle Container gebaut und automatisch gestartet.
Nach erfolgreichem Aufbau liefen folgende Container: mosquitto
, mqtt-sender
, mqtt-logger
, drei Instanzen von mqtt-receiver
, sowie postgres_db
.
Start der Empfänger
Einer der mqtt-receiver
-Container wurde geöffnet mit:
docker exec -it veit-mqtt-receiver-1 sh
Das Skript receiver.py
wurde manuell ausgeführt:
python receiver.py
Der Container wartete anschließend auf eingehende MQTT-Nachrichten.
Start des Senders
Der mqtt-sender
-Container wurde in einem separaten Terminal geöffnet:
docker exec -it mqtt-sender sh
Nach dem Start von sender.py
wurde im Terminal zur Eingabe einer Nachricht aufgefordert.
Jede eingegebene Nachricht wurde über den MQTT-Broker verteilt.
Datenbank-Zugriff
Mit dem Befehl docker exec -it postgres_db psql -U user -d mqtt_logs
wurde die Datenbank geöffnet. Die gespeicherten Nachrichten konnten mit
SELECT * FROM messages;
angezeigt werden.
Ergebnisse
Die gesendeten Nachrichten erschienen unmittelbar im Terminal des aktiven mqtt-receiver
-Containers.
Alle Nachrichten wurden parallel in der Datenbank gespeichert.
Die Kommunikation über MQTT funktionierte reibungslos zwischen Sender, Empfängern und Logger.
Die Nutzung von zwei getrennten Docker-Netzwerken (mqtt_network und db_network) ermöglichte eine gezielte Isolierung und Verbindungssteuerung der Dienste.
Probleme
Ein Problem stellte die Kommunikation zwischen den zwei Netzwerken da. Zur Vereinfachung wurde der mosquitto
-container in beiden Netzwerken eingebunden. So wurde die Kommunikation zwischen der Datenbank und dem Sender deutlich vereinfacht.
Autor: SH, VG
Versuch Teil 2 - Math Distributer
Vorbereitung
Für die Versuchsdurchführung wurde ein Docker-Setup mit mehreren Containern erstellt. Das Projekt umfasst:
- Einen Main-Container zur Verarbeitung und Auswertung des mathematischen Ausdrucks.
- Vier spezialisierte Container für:
- Addition
- Subtraktion
- Multiplikation
- Division
Die Kommunikation zwischen den Containern findet über HTTP-Requests in einem gemeinsamen Docker-Compose-Netzwerk statt.
Mathematische Ausdrucksverarbeitung
Die zentrale logische Komponente des Projekts ist der Shunting-yard-Algorithmus. Dieser konvertiert mathematische Ausdrücke von der üblichen Infix-Notation in die Postfix-Notation (Reverse Polish Notation). Dadurch wird die Reihenfolge der Operationen – unter Beachtung von Klammern und Prioritäten (Punkt- vor Strichrechnung) – eindeutig festgelegt und eine einfache, schrittweise Auswertung ermöglicht.
Verteilte Berechnung
Im Projekt werden die einzelnen Operationen (Addition, Subtraktion, Multiplikation, Division) in separate Container ausgelagert. Der Main-Container ruft diese per HTTP-Request auf, wodurch die Berechnung verteilt und modular erfolgt.
Durchführung
-
Start der Umgebung:
Im Hauptverzeichnis des Projekts wird das Setup mit folgendem Befehl gestartet:
Terminal window docker-compose up --buildDadurch werden alle Images gebaut und Container in einem gemeinsamen Netzwek gestartet
-
Eingabe und Verarbeitung eines Ausdrucks: In einem seperaten Terminal kann nun der mein Container gestartet werden
Terminal window docker-compose run mainDer Main-Container bietet eine interaktive Terminal-Eingabe, um mathematische Ausdrücke einzugeben, z. B.:
Terminal window Enter a valid calculation task> 5+5-5/2+3*9- Der Main-Container wandelt den Ausdruck mittels des Shunting-yard-Algorithmus in die Postfix-Notation um.
- Anschließend werden die einzelnen Operationen an die entsprechenden Service-Container delegiert.
- Das Endergebnis wird berechnet und im Terminal ausgegeben.
-
Direktes Testen der Services: Jeder Service kann auch direkt getestet werden, dazu muss man sich lediglich mit der Kommandozeile im jeweiligen Container befinden. Zum Beispiel für den Addition-Service (bei einer Portzuordnung 5001:5000):
Terminal window curl "http://localhost:5001/add?a=5&b=5"erwartete Antwort:
{"result": 10.0}
Beobachtung
- Alle Operationen funktionieren grundsätzlich und die Kommunikation zwischen den Containern erfolgt wie erwartet.
- Bei komplexeren Ausdrücken wurden anfänglich Probleme mit der Tokenisierung von Dezimalzahlen identifiziert und behoben.
- Die Verteilung der Rechenoperationen ermöglichte eine modulare Verarbeitung des Gesamtausdrucks.
Probleme
- Tokenisierung: Ursprünglich wurden Dezimalzahlen nicht korrekt erkannt, was zu falschen Berechnungen und Fehlern führte. Dies wurde durch Anpassen des regulären Ausdrucks behoben.
- Inter-Container-Kommunikation: Eine genaue Abstimmung der internen Ports war erforderlich, damit der Main-Container die Services korrekt ansprechen kann.
Autor: JF