私が制御しようとしているIoTデバイスがあるとします(例えば、温度の読み取り値を収集する)。 MQTTが適切であると思われます。私はそれを制御するためにデバイスにメッセージを公開することができ、デバイスはブローカに温度の読み取り値を報告するメッセージを発行することができました。ここまでは順調ですね。クラウドベースのシステムを介してMQTTを介してIoTデバイスに渡されるメッセージの順序を設定する方法(API設計の問題)
デバイスを制御するAPIを設計しようとすると、問題が発生し始めます。
デバイスに2つのトピックをサブスクライブ当日ます:その後、私はこれらのメッセージをパブリッシュ
に/
- /デバイスID /コントロールをいくつかの順番で話題になります。しかし、メッセージングは通常非同期プロセスであるため、デバイスが受信するメッセージの順序は保証されません。
-
が
- /デバイスID /制御/
- /デバイスID /コントロールON/OFF
彼らは可能性:だから場合には2つのメッセージは、次の順序で公開されている
を逆の順序で受信して、デバイスの電源を入れたままにしておくと、状況に応じて劇的な結果を招く可能性があります。例えばそこにただ一つのトピック
- /デバイスID /制御
ことができ、個々のメッセージのペイロードを運ぶAPIは、他の方法で設計することができるもちろん
個々のメッセージの意味(オン/オフ)。したがって、メッセージがこのトピックに所定の順序で公開される場合、メッセージはデバイス上で全く同じ順序で受信されることが期待されます。
しかし、個々のトピックへの公開順序を保証できない場合はどうすればよいですか? IoTデバイスのためのシステムの次のアーキテクチャを考える:システムの
/control service \ application -> broker -> control service -> broker -> IoT device \ control service/
コンポーネントは次のとおり効果ブローカ
- 典型的なメッセージにメッセージを発行することによって装置を制御
- アプリケーションブローカー
- いくつかのビジネスロジックと制御サービス
importanほとんどの現代の分散システムと同様に、制御サービスは、一度にアプリケーションからの複数の制御メッセージを処理することができる分散型のマルチインスタンスエンティティです。したがって、アプリケーションによって発行されるメッセージの順序は、IoTデバイスに配信されるときに完全に混在する可能性があります。
ほとんどのMQTTブローカーはQoS0とQoS1を実装していますが、QoS2を実装していないという事実を考慮すると、このような制御メッセージは複数回配信される可能性があります(QoS1 - https://stackoverflow.com/a/30959058/1776942参照)。
私の主張は、制御メッセージのための別々のトピックは悪い考えです。単一のトピックについても同じことが言えます。どちらの場合も、メッセージ配信順序保証はありません。
この特定の問題の唯一の解決策は、最新のバージョンプロパティを持つ別のメッセージの後に配信される古い(古い)メッセージを単にスキップできるように、メッセージのバージョン管理です。
- 何か不足していますか?
- この問題の唯一の解決方法はメッセージのバージョン管理ですか?
ありがとうございました。非常に面白いです、私は間違いなくそれを詳しく見ていきます。それにもかかわらず、私はこの問題にもっと価値あるアプローチがあるかどうかを確かめるために、しばらく質問を残しておきます。 –