2017-02-16 9 views
2

現在、私たちはMQTTによって複数のデバイスを制御するアプリケーションを持っています。各デバイスは、デバイスIDの後に名前が付けられたユニークなトピックにサブスクライブします。たとえば、デバイスAはデバイスID 123を持っているため、トピック123を購読します。次に、アプリケーションがデバイスAに制御メッセージを公開したい場合は、デバイスAのデバイスIDである123という名前のトピックを公開します。Mosquitto MQTTの特定のクライアントにメッセージを公開する方法

これを行うことで、1000個のデバイスがあれば、1000個のトピックが作成されます。これは本当に悪いデザインです。したがって、ブローカに接続する各クライアントはクライアントIDを設定する必要があるため、トピックを受け取るクライアントIDを設定することによって、特定のクライアントにトピックを公開できると考えています。しかし、特定のクライアントに公開する方法はありませんでした。そして、MQTTはそのようなことを処理していないようです。同じトピックを購読しているクライアントにのみ公開します。

私たちが1つのトピックを達成するために行うことができる他の方法はありますか?それでも特定のクライアントにメッセージを発行することはできますか?

ありがとうございます!

+0

「_これは本当に悪いデザインです」どうしてそう思うの?トピックは安いです。 1000トピックは1000xメモリをどこでも食べることはありません。 –

+0

@PavelZdenek本当ですか?もっと多くのデバイスがあれば、多くのメモリが必要になると思ったので、私はそう考えていました。もちろん、1000は本当に小さい数字ですが、何百万以上の場合はどうなりますか?私は本当に確信していません。 –

+0

1つのブローカに何百万ものデバイスを登録すると、確実に多くのメモリを消費します。しかし、トピックの特異性は記憶のほんの一部です。スケーラビリティは、不特定のトピックを使用するのではなく、ブローカのクラスタリング/ブリッジによって解決されます。このような大規模な操作を計画している場合は、クライアントのトピックの前にパーティションや「市外局番」を置くようにしてください。 –

答えて

5

MQTTプロトコル・レベルで単一のサブスクライバにメッセージをパブリッシュする方法はありません。

パブ/サブシステムの重要なテナントの1つは、パブリッシャをサブスクライバから完全に切り離すことです。パブリッシャが、特定のトピックのサブスクライバがあるかどうかを知る方法はありません。

トピックごとにブローカーに事実上オーバーヘッドがないため、各デバイスのトピックを使用することは問題ありません。また、ACLを使用して、各クライアントが自分のトピックだけを購読できるようにすることもできます(必要に応じて他の人に公開することができます)。

すべてのクライアントがサブスクライブし、メッセージが自己のものかどうかをデバイスに判断させることができます。これに対しては、このモデルにはACLを適用できないという欠点があります。

+0

こんにちは、ありがとうございました。その場合、ブローカに接続するときにクライアントによって設定されるクライアントIDの使用は何ですか? –

+0

クライアントIDは、永続的なサブスクリプションを追跡するためのもので、クライアントがオフラインになる前に購読していた高いQOSメッセージを配信するためのアンカーとして使用します。 – hardillb

+0

可能な限りトピックの数を制限します。私は、他のMQTTブローカーがクライアントIDを介してメッセージをフィルターに掛けることができるようになり、クライアントIDを設定できるようになり、ブローカーはそのクライアントにメッセージを送信します。これは、ブローカーの実装方法やMQTTの「標準」に応じてのみ可能ですか?私はMosquittoのような可能性を見ないので、 –

関連する問題