Skip to content

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) und db_network (für Datenbankanbindung)
  • Eine einfache Mosquitto-Konfigurationsdatei

Container-Architektur

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:

Terminal window
docker exec -it veit-mqtt-receiver-1 sh

Das Skript receiver.py wurde manuell ausgeführt:

Terminal window
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:

Terminal window
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.

Container-Architektur

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

  1. Start der Umgebung:

    Im Hauptverzeichnis des Projekts wird das Setup mit folgendem Befehl gestartet:

    Terminal window
    docker-compose up --build

    Dadurch werden alle Images gebaut und Container in einem gemeinsamen Netzwek gestartet

  2. Eingabe und Verarbeitung eines Ausdrucks: In einem seperaten Terminal kann nun der mein Container gestartet werden

    Terminal window
    docker-compose run main

    Der 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.
  3. 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