Azure Event Grid MQTT Broker の Shared サブスクリプションは messaging pattern で、複数のクライアントが 1 つのトピック サブスクリプションからのメッセージをグループとして使用できるため、ブローカーは負荷分散された方法でクライアント間でメッセージを分散できます。 各サブスクライバーが各メッセージを受信する代わりに、共有グループ内の 1 つのクライアントのみが各メッセージを受信するため、バックエンド処理システムのスケーラビリティとスループットが向上します。
共有サブスクリプションのしくみ
標準 MQTT サブスクリプションでは、サブスクライブされているすべてのクライアントが各メッセージのコピーを受け取ります。 共有サブスクリプションでは、ブローカーはクライアントのグループを単一の論理サブスクライバーとして扱い、それらの間でメッセージを分散します。
- 共有フィルターに一致する各アプリケーション メッセージは、グループ内の 1 つのアクティブなセッションにのみ配信されます
- 分散は通常、グループ内でランダムな方法で負荷分散されます
- クライアント セッションには、共有サブスクリプションと非共有サブスクリプションの両方が同時に含まれる場合があります
- 複数のグループが同じトピックを個別にサブスクライブできる
共有サブスクリプション トピックの形式
共有サブスクリプションでは、次の形式が使用されます。
$share/{group-name}/{topic-filter}
コンポーネント:
-
$share→ 共有サブスクリプションを識別する -
{group-name}論理コンシューマーグループ -
{topic-filter}→ トピックまたはワイルドカード サブスクリプション
Example:
$share/order-processors/retail/orders/#
主要な特徴
- 負荷分散された消費量: メッセージは、効率的な処理を確保するために、同じグループ内のクライアント間で分散されます。
- 水平方向のスケーラビリティ: コンシューマーは、発行元に影響を与えることなく、個別にスケールアウトできます。
- 独立したコンシューマー グループ: 複数の共有グループは、内部的に分散しながら、同じメッセージを個別に受信します。
- 混合サブスクリプションのサポート: クライアントは、共有サブスクリプションと非共有サブスクリプションの両方を同じセッションで維持できます。
シナリオ例: 小売注文処理
Event Grid MQTT Broker を使用した小売注文処理シナリオを考えてみましょう。
- トピック:
retail/orders - 共有グループ:
order-workers - クライアント: Worker1、Worker2、Worker3
フロー:
- 注文は
retail/ordersへ発行されます。 - すべてのワーカーは次に登録します。
$share/order-workers/retail/orders - Event Grid MQTT Broker では、次の分散が行われます。
- Order 1 → Worker1
- Order 2 → Worker2
- Order 3 → Worker3
各注文は 1 回処理され、システムは水平方向にスケーリングされます。
プロトコルの動作と制約
MQTT バージョンのサポート
- MQTT 5 のみの機能
-
$share/...を試行している MQTT 3.1.1 クライアントは切断されます
メッセージ配信セマンティクス
- 各メッセージは、グループごとに 1 つのクライアントに配信されます
- 配信は、少なくとも 1 回のセマンティクスに従います (QoS 1)
メッセージの順序付け
- グループ メンバー間での厳密な順序付け保証なし
セッションの動作
- セッションの有効期限は、メッセージ配信に影響します。
- クライアントが切断され、セッションの有効期限が切れると、メッセージが再割り当てされる可能性があります
- 永続的なセッションによって信頼性が向上する
Event Grid MQTT Broker のユース ケース
共有サブスクリプションは、次の場合に最適です。
- 高スループットの IoT テレメトリ処理: テレメトリまたはイベントを複数の処理サービスに分散します。
- バックエンド ワーカー プール/マイクロサービス: ステートレス サービスが重複せずにイベントを処理できるようにします。
- 統合名前空間 (UNS) コンシューマー: 高スループットの産業用データ ストリームを効率的に使用します。
共有サブスクリプションを使用する場合
次の場合に共有サブスクリプションを使用します。
- 並列メッセージ処理が必要です。
- 1 つのコンシューマーが負荷を処理できません。
- スケーラブルで回復力のあるアーキテクチャが必要です。
- カスタム負荷分散を構築しないようにする必要があります。