Blog - MQTT QoS i backpressure — kiedy QoS 2 szkodzi

Dlaczego w telemetrii przemysłowej wyższy QoS nie zawsze oznacza lepszą niezawodność oraz jak modelować flow control.

Autor
2code
Opublikowano
Tagi
  • MQTT
  • IoT
  • backpressure

W integracjach Modbus → MQTT często pojawia się intuicja: „ustawmy QoS 2, będzie najbezpieczniej”. W praktyce przy burstach telemetrii QoS 2 potrafi zwiększyć opóźnienie i zgubić świeże dane.

Model kolejki

Załóżmy, że broker lub edge gateway ma skończoną kolejkę o pojemności NN. Przy napływie λ\lambda wiadomości/s i obsłudze μ\mu wiadomości/s wykorzystanie wynosi:

ρ=λμ\rho = \frac{\lambda}{\mu}

Gdy ρ1\rho \to 1, średnia liczba wiadomości w kolejce (M/M/1) rośnie jak:

L=ρ1ρL = \frac{\rho}{1 - \rho}

QoS 2 dodaje handshake (PUBREC / PUBREL / PUBCOMP), więc efektywne μ\mu spada — ρ\rho rośnie szybciej niż przy QoS 0/1.

Przepływ decyzji

Praktyczna reguła

  1. Telemetria wysokiej częstotliwości — QoS 0 + coalescing (ostatnia wartość wygrywa).
  2. Alarmy / komendy — QoS 1 (co najmniej raz) z idempotentnym konsumentem.
  3. QoS 2 — tylko gdy dokładnie-raz jest wymaganiem biznesowym i wolumen jest niski.

Wzór na budżet opóźnienia

Jeśli akceptujesz maksymalne opóźnienie TT sekund przy burstach, to przy średnim rozmiarze wiadomości ss bajtów i paśmie BB B/s:

NmaxBTsN_{\max} \approx \frac{B \cdot T}{s}

Przekroczenie NmaxN_{\max} bez strategii drop/coalesce oznacza, że „niezawodny” QoS 2 i tak dostarczy przestarzałe próbki.

Wniosek

Niezawodność w IoT to nie maksymalny QoS, tylko świadomy kontrakt: które dane muszą dotrzeć zawsze, a które wystarczy „najnowsze wygrywa”.

Wróć do bloga

Porozmawiajmy o Twoim projekcie