Files
votianlt/CHANGELOG_MQTT.md
2025-10-23 12:18:42 +02:00

8.4 KiB

MQTT System Changelog

Version 2.0.0 - 2025-10-22

Breaking Changes

1. MQTT-Broker-Port geändert

  • Alt: Port 1883
  • Neu: Port 42099
  • Broker: mqtt-2.assecutor.de:42099
  • Grund: Neuer dedizierter Port für die Produktionsumgebung

2. Konfigurationssystem umgestellt

Die alte app.mqtt.* Konfiguration wurde durch das neue Plugin-System ersetzt.

Entfernte Konfiguration:

app.mqtt.enabled=true
app.mqtt.broker-uri=mqtt://mqtt-2.assecutor.de
app.mqtt.client-id=server-${random.uuid}
app.mqtt.clean-start=false
app.mqtt.session-expiry-interval=86400
app.mqtt.keep-alive=30
app.mqtt.max-inflight=50
app.mqtt.automatic-reconnect=true
app.mqtt.default-qos=2
app.mqtt.default-retained=false

Neue Konfiguration:

# Messaging Plugin Configuration
app.messaging.plugin.type=mqtt
app.messaging.plugin.mqtt.broker.host=mqtt-2.assecutor.de
app.messaging.plugin.mqtt.broker.port=42099
app.messaging.plugin.mqtt.username=app
app.messaging.plugin.mqtt.password=apppwd
app.messaging.plugin.mqtt.client.id=votianlt-server

Neue Features

1. Plugin-basiertes Messaging-System

  • Abstraktionsschicht für verschiedene Messaging-Protokolle
  • Einfacher Wechsel zwischen MQTT, WebSocket, gRPC möglich
  • Einheitliche API für alle Messaging-Backends

Hauptkomponenten:

  • MessagingPlugin Interface
  • MqttMessagingPlugin Implementierung
  • PluginManager für Plugin-Verwaltung
  • PluginMessagingConfig für Konfiguration

2. Message Envelope System

Alle Nachrichten werden jetzt in Envelopes verpackt:

public class MessageEnvelope {
    private String messageId;           // UUID
    private Instant timestamp;          // Zeitstempel
    private String topic;               // MQTT-Topic
    private Object payload;             // Eigentliche Nachricht
    private boolean requiresAck;        // ACK erforderlich?
    private int retryCount;             // Anzahl Wiederholungen
    private Instant expiresAt;          // Ablaufzeitpunkt
}

3. Acknowledgment-System

  • Automatische ACK-Verwaltung
  • Retry-Mechanismus bei fehlenden ACKs
  • Konfigurierbare Timeouts und Wiederholungen
public class AcknowledgmentMessage {
    private String messageId;
    private Instant timestamp;
    private String status;              // SUCCESS oder FAILED
    private String errorMessage;
}

4. Verbesserte Fehlerbehandlung

  • Erhöhter Connection-Timeout: 30s → 60s
  • Detaillierte Fehlerdiagnose:
    • TimeoutException: Broker nicht erreichbar
    • UnknownHostException: DNS-Fehler
    • ConnectException: Port blockiert
  • Automatische Wiederverbindung mit exponentieller Backoff

5. Konfigurierbare Timeouts

Neue Konfigurationsoptionen:

app.messaging.plugin.mqtt.connection.timeout.seconds=60
app.messaging.plugin.mqtt.keep.alive.seconds=60

Entfernte Komponenten

Gelöschte Klassen:

  1. MqttProperties.java - Ersetzt durch Plugin-Konfiguration
  2. MqttConfig.java - Nicht mehr benötigt

Grund für Entfernung:

Diese Klassen wurden durch das neue Plugin-System obsolet und waren nicht mehr in Verwendung.

Geänderte Komponenten

1. MqttMessagingPlugin

Datei: src/main/java/de/assecutor/votianlt/messaging/plugin/mqtt/MqttMessagingPlugin.java

Änderungen:

  • Connection-Timeout von 30s auf 60s erhöht
  • Konfigurierbare Timeout-Parameter hinzugefügt
  • Verbesserte Fehlerbehandlung mit spezifischen Exception-Checks
  • Detailliertes Logging für Verbindungsprobleme
// Neu: Konfigurierbare Timeouts
private static final String CONFIG_CONNECTION_TIMEOUT = "connection.timeout.seconds";
private static final String CONFIG_KEEP_ALIVE = "keep.alive.seconds";

// Verbesserte Fehlerbehandlung
if (throwable instanceof java.util.concurrent.TimeoutException) {
    log.error("[MqttPlugin] Connection timeout - broker may be unreachable");
} else if (throwable.getCause() instanceof java.net.UnknownHostException) {
    log.error("[MqttPlugin] Unknown host - DNS resolution failed");
} else if (throwable.getCause() instanceof java.net.ConnectException) {
    log.error("[MqttPlugin] Connection refused - broker may be down");
}

2. PluginMessagingConfig

Datei: src/main/java/de/assecutor/votianlt/messaging/config/PluginMessagingConfig.java

Änderungen:

  • Verwendet neue Konfigurationsparameter
  • Initialisiert Plugin mit korrektem Port (42099)
  • Setzt Authentifizierung (username/password)

3. application.properties

Datei: src/main/resources/application.properties

Änderungen:

  • Alte app.mqtt.* Konfiguration entfernt (Zeilen 57-71)
  • Neue app.messaging.plugin.mqtt.* Konfiguration verwendet
  • Port auf 42099 aktualisiert

Architektur-Änderungen

Neue Architektur-Schichten:

Application Layer (Services, Controllers)
        ↓
MessageDeliveryService (Envelope-Wrapping, Queue-Management)
        ↓
PluginManager (Plugin-Verwaltung)
        ↓
MessagingPlugin Interface (Protokoll-Abstraktion)
        ↓
MqttMessagingPlugin (MQTT-spezifische Implementierung)
        ↓
HiveMQ MQTT Client

Vorteile der neuen Architektur:

  1. Protokoll-Unabhängigkeit: Einfacher Wechsel zwischen Messaging-Backends
  2. Testbarkeit: Mock-Plugins für Tests
  3. Wartbarkeit: Klare Trennung der Verantwortlichkeiten
  4. Erweiterbarkeit: Neue Protokolle einfach hinzufügbar

Migration Guide

Server-Migration (bereits durchgeführt):

  1. Port auf 42099 geändert
  2. Alte Konfiguration entfernt
  3. Neue Plugin-Konfiguration aktiviert
  4. Timeout erhöht
  5. Fehlerbehandlung verbessert

Client-Migration (erforderlich):

Siehe MQTT_MIGRATION_GUIDE.md für detaillierte Anweisungen.

Wichtigste Schritte:

  1. Port auf 42099 ändern
  2. Authentifizierung hinzufügen (username: app, password: apppwd)
  3. Message-Envelope-Format implementieren
  4. ACK-Handling implementieren
  5. Timeout auf 60s erhöhen

Kompatibilität

Abwärtskompatibilität:

  • Topic-Struktur unverändert
  • Legacy-Nachrichten werden noch unterstützt
  • ⚠️ Neue Clients sollten Envelope-Format verwenden

Vorwärtskompatibilität:

  • Neue Features sind optional
  • Schrittweise Migration möglich
  • Alte und neue Clients können parallel laufen

Testing

Getestete Szenarien:

  1. Verbindung zum neuen Broker (mqtt-2.assecutor.de:42099)
  2. Authentifizierung mit username/password
  3. Subscription zu allen Topics
  4. Message-Envelope-Verarbeitung
  5. ACK-Handling
  6. Automatische Wiederverbindung
  7. Timeout-Handling

Test-Logs:

11:29:26.251 [RxComputationThreadPool-1] INFO  MqttMessagingPlugin - Connected successfully
11:29:26.414 [RxComputationThreadPool-3] INFO  MqttMessagingPlugin - Successfully subscribed to: /ack/server/+
11:29:26.414 [RxComputationThreadPool-4] INFO  MqttMessagingPlugin - Successfully subscribed to: /server/+/task_completed
11:29:26.414 [RxComputationThreadPool-5] INFO  MqttMessagingPlugin - Successfully subscribed to: /server/+/jobs/assigned
11:29:26.415 [RxComputationThreadPool-6] INFO  MqttMessagingPlugin - Successfully subscribed to: /server/+/message
11:29:26.417 [RxComputationThreadPool-7] INFO  MqttMessagingPlugin - Successfully subscribed to: /server/+/login

Performance

Verbindungsaufbau:

  • Vorher: ~30s bis Timeout bei Fehlern
  • Nachher: ~60s bis Timeout, aber schnellere Fehlerdiagnose

Nachrichtendurchsatz:

  • Keine Änderung (QoS 2, exactly once)
  • Envelope-Overhead: ~200 Bytes pro Nachricht

Bekannte Probleme

Keine bekannten Probleme

Alle Tests erfolgreich durchgeführt.

Nächste Schritte

  1. Client-Migration: Mobile Apps auf neuen Port und Envelope-Format umstellen
  2. Monitoring: Metriken für Message-Delivery-Service hinzufügen
  3. Dokumentation: API-Dokumentation für Envelope-Format erweitern
  4. Testing: Integration-Tests für verschiedene Fehlerszenarien

Rollback-Plan

Falls Probleme auftreten:

  1. Port zurücksetzen:

    app.messaging.plugin.mqtt.broker.port=1883
    
  2. Alte Konfiguration wiederherstellen:

    • MqttProperties.java aus Git-Historie wiederherstellen
    • MqttConfig.java aus Git-Historie wiederherstellen
    • Alte app.mqtt.* Konfiguration in application.properties einfügen
  3. Server neu starten

Kontakt

Bei Fragen oder Problemen:

  • Siehe MQTT_MIGRATION_GUIDE.md für Client-Migration
  • Siehe MESSAGING_LAYER.md für Architektur-Details
  • Siehe CLAUDE.md für allgemeine System-Dokumentation