Existe-t-il un moyen de préserver le niveau de QoS MQTT jusqu'à ce qu'il atteigne le client?

9

MQTT permet aux expéditeurs de définir un niveau de qualité de service (QoS), qui fournit certaines garanties quant à la réception d'un message (et si les doublons sont autorisés). Cet article de HiveMQ met en évidence le problème de la rétrogradation , où un client avec un niveau de QoS inférieur ne recevra pas le message avec les garanties que l'expéditeur a demandé:

Comme déjà dit, les flux de QoS entre un client de publication et d'abonnement sont deux choses différentes et la QoS peut être différente. Cela signifie que le niveau de QoS peut être différent du client A, qui publie un message, et du client B, qui reçoit le message publié. Entre l'expéditeur et le courtier, la qualité de service est définie par l'expéditeur. Lorsque le courtier envoie le message à tous les abonnés, la QoS de l'abonnement du client B est utilisée.

MQTT fournit-il un moyen d'indiquer que cette rétrogradation n'est pas acceptable et que le message doit être remis en utilisant la qualité de service demandée par l'expéditeur d'origine? La seule option est-elle de s'assurer que l'expéditeur et le destinataire ont le paramètre de qualité de service souhaité avant de transmettre le message?

Aurora0001
la source

Réponses:

8

Une chose à retenir lorsque vous travaillez avec MQTT est que "les abonnés et les éditeurs sont considérés comme des clients MQTT".

Comme indiqué, la qualité de service définie lors de la publication est entièrement liée au courtier (B) et non aux autres clients. Donc, pour s'assurer que l'abonné (S) reçoit tout ce que l'éditeur (P) publie, il faut utiliser QoS 1.

Regardons les cas: P - envoie avec QoS 0, ce qui signifie que chaque message sera au moins B une fois (une fois ou zéro). Dans ce cas, si S s'abonne à B avec QoS 0 - il n'y a aucune garantie que même lorsque le courtier (B) reçoit un message qui va finalement atteindre S. QoS 1 - S recevra certainement QoS 2 - S ne recevra pas plusieurs messages alors que le courtier peut

Si nous faisons de même avec d'autres QoS. Nous apprendrons que la QoS1 pour les abonnés fonctionne bien avec tous les niveaux, car la QoS 1 est un surensemble de tous.


MQTT ne fournit aucune indication à ce sujet, mais nous pouvons obtenir la qualité de service de l'expéditeur en utilisant la qualité de service 1 lors de l'abonnement.

bravokeyl
la source
4

Les niveaux QoS 1 ou 2 garantissent uniquement que le message publié est parvenu au courtier. L'abonné QoS 1 ou 2 assure au courtier que le message a été reçu.

Publier avec 1 ou 2 ne signifie pas que quiconque écoute.

Quel est votre cas d'utilisation?

fixitchris
la source
3
Ne posez pas de questions dans les réponses. Si quelque chose n'est pas clair, laissez d'abord un commentaire.
Bence Kaulics
Je suis curieux de connaître toute situation dans laquelle un capteur pourrait envoyer des données au courtier de messages, puis être transféré vers un ordinateur ou un autre processeur où il est essentiel que les garanties de qualité de service soient conservées.
Aurora0001