> [time=Sun, Jul 1, 2023][name=Lucas Colaço][name=Lukas Bühler][color=#db4eae]
# 1. Liste aller System und Dienste, die wir gebraucht habt
Wir haben folgende Systeme und Dienste verwendet:
1. **Mosquitto (MQTT Broker)**: Ein Open Source Message Broker, der das MQTT-Protokoll verwendet. Er ermöglicht die Kommunikation zwischen den Sensoren und den Verbrauchern.
2. **Docker**: Eine Plattform, die den Prozess der Anwendungsbereitstellung durch die Verwendung von Containern vereinfacht.
3. **Apache Paho**: Eine Java-Bibliothek, die MQTT-Protokoll-Implementierungen zur Verfügung stellt. Wir haben sie verwendet, um ein Java-Programm zu erstellen, das MQTT-Nachrichten publiziert und abonniert.
4. **Grafana**: Ein Open-Source-Tool zur Visualisierung und Analyse von Metriken. Wir haben es verwendet, um die Daten, die von unseren Sensoren generiert wurden, grafisch darzustellen.
5. **Prometheus**: Ein Open-Source-System zur Überwachung und Alarmierung. Es wurde verwendet, um Metriken von unseren verschiedenen Servern zu sammeln.
6. **Node Exporter**: Ein Prometheus Exporter für Hardware- und OS-Metriken mit pluggable Metriksammlern.
7. **Nginx (Load Balancer)**: Ein Open Source Reverse Proxy Server für HTTP, HTTPS, SMTP, POP3 und IMAP Protokolle, sowie ein Load Balancer, HTTP Cache und Webserver.
# 2. Wie hängen diese Systeme zusammen?
Unser Gesamtsystem besteht aus mehreren Komponenten, die zusammenarbeiten, um Daten zu sammeln, zu übertragen und zu visualisieren.
## 2.1 **Komponentendiagramm:**
```graphviz
digraph hierarchy {
node [fontname=Monospace, fontsize=9, shape=box]
edge [fontname=Monospace, fontsize=7]
node [color=Red,fontname=Courier,shape=box]
edge [color=Blue, style=dashed]
nodesep=0.4
docker [label="Docker"]
mosquitto [label="Mosquitto\nBroker(MQTT)"]
sensor2 [label="Sensor 2\n(Java)"]
sensor1 [label="Sensor 1\n(Java)"]
grafana [label="Grafana"]
prometheus [label="Prometheus"]
node_exporter [label="Node\nExporter"]
nginx [label="Nginx"]
docker -> mosquitto [label="Compose \nStack"]
docker -> nginx [label="Compose \nStack"]
docker -> sensor1 [label="Compose \nStack"]
docker -> sensor2 [label="Compose \nStack"]
docker -> node_exporter [label="Compose \nStack"]
docker -> prometheus [label="Dockerfile"]
nginx -> sensor1 [label="Load Balance"]
nginx -> sensor2 [label=""]
node_exporter -> prometheus [label="Usage Data"]
sensor1 -> mosquitto [label="Publish\n(MQTT msg)"]
sensor2 -> mosquitto [label=""]
mosquitto -> grafana [label="Data\n(MQTT msg)"]
mosquitto -> prometheus [label="Data\n(MQTT msg)"]
}
```
## 2.2 **Deployment Diagramm:**
Es gibt zwei docker-compose files. Eines für das Deployment auf mehreren Servern und ein weitere compose File für das Monitoring.
```graphviz
digraph D {
subgraph cluster_Docker {
label = "Docker";color=blue
subgraph cluster_Dockercompose {
label = "Compose Stack (Server)";color=red
node_exporter;
subgraph cluster_gc2 {
label = "Load balancer";
nginx;
"Sensor 2";
"Sensor 1";
mosquitto;
}
}
subgraph cluster_Monitoring {
label = "Compose Stack (Monitoring)";color=orange
prometheus;
Grafana;
}
}
}
}
```
# 3. Detailbeschreibung der Interaktionen
Die Java-Anwendung simuliert Sensoren, indem sie Sinuswerte berechnet und diese als MQTT-Nachrichten an den Mosquitto Broker sendet. Der Broker verteilt diese Nachrichten an alle abonnierten Entitäten, in diesem Fall Grafana zur Visualisierung und Prometheus zur Überwachung.
```mermaid
sequenceDiagram
participant User
participant Grafana
participant Prometheus
participant Broker
Sensor->>Broker: Publish sinusoidal values
Broker->>Grafana: Send sinusoidal values
Broker->>Prometheus: Send sinusoidal values
Grafana->>User: Display visualized data
Prometheus->>User: Display monitored data
```
# 4. Beispiel eines Ablaufs der Interaktion (End-2-End)
- Die Java-Anwendung berechnet einen Sinuswert und publiziert diesen an den Mosquitto-Broker.
- Der Mosquitto-Broker leitet diese Nachricht an alle Abonnenten weiter, in diesem Fall Grafana und Prometheus.
- Grafana empfängt die Nachricht, aktualisiert das Dashboard und zeigt den neuen Sinuswert an.
- Prometheus empfängt die Nachricht und aktualisiert seine eigenen Metriken entsprechend. Zusätzlich überwacht es den Status und die Auslastung der Server.
- Der Benutzer kann nun die aktualisierten Sinuswerte in Grafana sehen. In Prometheus können zusätzlich die überwachten Daten von mehreren Server eingesehen werden, wie z.B. Auslastung und Betriebszustand.
{"title":"Modul 321: Verteilte Systeme programmieren - Dokumentation","description":"sequenceDiagramparticipant REST-Clientparticipant GraphQLparticipant MQTTREST-Client->>GraphQL: DatenanfrageGraphQL–>>MQTT: DatenanfrageMQTT->>GraphQL: DatenantwortGraphQL->>REST-Client: Datenantwort","contributors":"[{\"id\":\"70364ad2-9375-4c87-85cc-9b4bdacb21ad\",\"add\":10041,\"del\":5336}]"}