2017-11-09 4 views
1

MQTTメッセージを最初のサブスクライバが受信した後に削除して、他のサブスクライバがそれを読み取れないようにする方法はありますか?
この奇妙な質問を明確にするには:
私は4つのJBossインスタンスを扱わなければなりません(私はこのアーキテクチャーの責任を絶対に負いません)。彼らはお互いの鏡です。だから、すべての人が特定のトピックを購読する仕事をしています。このトピックのメッセージは、データベースに保存されます。私が避けなければならないのは、同じメッセージが4回持続されるということです。だから、私の考えはトピックに関する競争条件を作り出すことでした。メッセージを読み取った最初のジョブはそれを削除し、他のジョブはそれを受信しません。 これは可能ですか?MQTTメッセージを最初のサブスクライバが読み取った後に削除します

答えて

2

ソート答えいいえ、メッセージが公開されると「削除」することはできません。ブローカーはすべてのサブスクライバにほぼ即時に配信します。

あなたが探しているものは、共有サブスクリプションと呼ばれるものです。これにより、クライアントのグループは効果的に1つのユニットとしてトピックに登録することができ、メッセージはグループのいずれかにのみ配信されます。これは、ロードバランシングを目的としています。共有サブスクリプションは、v5の一部としてMQTT仕様に追加されます。

現在、多数のブローカがこの機能を実装しています(各ブローカはわずかに異なる実装であるため、v5までブローカの実装をシームレスに切り替えることはできません)。私は、次のブローカーが共有サブスクリプションのサポートのいくつかのバージョンを持っていると信じて、より多くのがあるかもしれない:

  • HiveMQ
  • IBMメッセージ視力アプライアンス
  • サブスクリプションの主な目的は、にある場合
+0

を使用するときは、QoS 1またはデータの損失を使用するときに重い負荷に最適なストレージ(あなたの質問で述べたように)、または重複可能性のためのQoS 2を使用する場合

サブスクライブは常にどちらかのオーバーヘッドをすることができご回答どうもありがとうございました。共有購読をサポートするブローカーを使用するかどうかを確認します。 – Raistlin

+0

共有購読のためのIBM Message Sight構文と苦労した後、それは魅力的に機能します。どうもありがとうございました。 – Raistlin

0

vernemq DB内のデータを永続させるには、MQTT Brokerの後端でAPI呼び出しまたはダイレクト・コード統合を使用してデータを取得して格納する必要があります。あなたは、QoS 0

関連する問題