クライアントに到達するまでMQTT QoSレベルを保持する方法はありますか?


9

MQTTを使用すると、送信者はサービスの品質(QoS)レベルを設定できます。これにより、メッセージが受信されるかどうか(および重複が許可されるかどうか)に関する特定の保証が提供されます。HiveMQからのこの記事では、QoSレベルが低いクライアントが、送信者が要求した保証を備えたメッセージを受信しないというダウングレードの問題を強調しています。

すでに述べたように、パブリッシングクライアントとサブスクライブクライアント間のQoSフローは2つの異なるものであり、QoSも異なる場合があります。つまり、QoSレベルは、メッセージをパブリッシュするクライアントA、およびパブリッシュされたメッセージを受信するクライアントBとは異なる可能性があります。送信者とブローカーの間で、QoSは送信者によって定義されます。ブローカーがすべてのサブスクライバーにメッセージを送信すると、クライアントBからのサブスクリプションのQoSが使用されます。

MQTTは、このダウングレードが受け入れられないこと、およびメッセージが元の送信者の要求されたQoSを使用して配信される必要があることを示す方法を提供しますか?メッセージを送信する前に、送信者と受信者の両方に必要なQoS設定があることを確認する唯一のオプションはありますか?

回答:


8

MQTTを使用するときに覚えておくべきことの1つは、「サブスクライバーとパブリッシャーの両方がMQTTクライアントと見なされる」ということです。

前述のように、公開中に設定されたQoSは、他のクライアントではなくブローカー(B)に完全に関連しています。したがって、サブスクライバー(S)がパブリッシャー(P)がパブリッシュするすべてのものを確実に受信するには、QoS 1を使用する必要があります。

ケースを見てみましょう:P-QoS 0で送信します。これは、すべてのメッセージが最大で一度Bにあることを意味します(1回または0)。この場合、SがQoS 0でBにサブスクライブする場合、ブローカー(B)が最終的にSに到達するメッセージを受信した場合でも保証はありません。QoS 1-Sは確実にQoSを受信します2-Sはブローカーが受信できる間は複数のメッセージを受信しません

他のQoSについても同様です。QoS 1はすべてのスーパーセットであるため、加入者のQoS1がすべてのレベルで適切に機能することを知ることができます。


MQTTは同じことを示しませんが、サブスクライブ中にQoS 1を使用して送信者のQoSを達成できます。


4

QoS 1または2レベルは、パブリッシュされたメッセージがブローカーに到着したことのみを保証します。サブスクライバーQoS 1または2は、メッセージが受信されたことをブローカーに保証します。

1または2で公開しても、誰もが聞いているわけではありません。

あなたのユースケースは何ですか?


3
回答では質問しないでください。不明な点がある場合は、最初にコメントを残してください。
Bence Kaulics 16

センサーがメッセージブローカーにデータを送信し、QoS保証が維持されることが重要であるコンピューターまたはその他のプロセッサに転送される可能性がある状況について、私は興味があります。
Aurora0001
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.