このトピックでは、ApsaraMQ for RocketMQ におけるサブスクリプションの定義、モデル関係、内部属性、および使用に関する推奨事項について説明します。
定義
サブスクリプションは、ApsaraMQ for RocketMQ システムでコンシューマーがメッセージを取得して処理するために使用する一連のルールとステータス構成です。
コンシューマーグループは、サブスクリプションをサーバーに動的に登録します。メッセージの送信中に、サブスクリプションで定義されたフィルター ルールに基づいてメッセージが照合され、消費の進行状況が維持されます。
サブスクリプションを構成することで、次の送信動作を制御できます。
サブスクライブされたメッセージのコレクション: これは、コンシューマーがサブスクライブするメッセージと、Topic 内のどのメッセージをコンシューマーが消費するかを制御します。
消費の進行状況: ApsaraMQ for RocketMQ サーバーは、デフォルトでサブスクリプションの永続化を提供します。コンシューマーグループがサーバーにサブスクリプションを登録した後、コンシューマーがオフラインになってからオンラインに戻った場合、コンシューマーは以前の消費の進行状況を取得して消費を再開できます。
Topic とコンシューマーグループのマッピング関係
1 つの Topic を複数のコンシューマーグループでサブスクライブ可能
ApsaraMQ for RocketMQ は、1 対多のサブスクリプションモデルをサポートしています。各コンシューマーグループの Topic へのサブスクリプションは独立しています。各グループは、Topic 内のすべてのメッセージまたは一部のメッセージをサブスクライブできます。

1 つのコンシューマーグループで複数の Topic をサブスクライブ可能
次の図に示すように、コンシューマーグループ Group A は、Topic A と Topic B の 2 つの Topic をサブスクライブします。Group A のコンシューマーにとって、Topic A へのサブスクリプションは 1 つのサブスクリプション関係であり、Topic B へのサブスクリプションは別のサブスクリプション関係です。2 つのサブスクリプションは独立しており、互いに影響を与えることなく個別に定義できます。

内部属性
消費モード
定義: コンシューマーがメッセージを消費するモード。
値:
CLUSTERING: このモードは、Lite タイプの Topic ではない Topic をサブスクライブするために使用されます。メッセージは、負荷分散ルールに基づいて、コンシューマーグループ内の 1 つのコンシューマーに配信されます。
LITE_SELECTIVE: このモードは、Lite タイプの Topic をサブスクライブするために使用されます。同じコンシューマーグループ内の異なるコンシューマーは、Lite Topic の異なるコレクションをサブスクライブできます。
メッセージフィルタープロパティ
消費モードが CLUSTERING の場合、メッセージフィルター構成を使用できます。
フィルタータイプ
定義: メッセージフィルター ルールのタイプ。サブスクリプションにメッセージフィルター ルールを設定すると、システムはそのルールに基づいて Topic 内のメッセージを照合します。指定された条件を満たすメッセージのみがコンシューマーに配信されます。この機能により、メッセージをさらに分類できます。
値:
TAG フィルタリング: タグ文字列の全文に基づいてメッセージをフィルタリングおよび照合します。
SQL92 フィルタリング: SQL 構文に基づいてメッセージ属性をフィルタリングおよび照合します。
フィルター式
定義: カスタムフィルター ルールの式。
値: 構文の詳細については、「フィルター式の構文」をご参照ください。
動作上の制約
消費モードが CLUSTERING の場合
消費モードが CLUSTERING の場合、同じコンシューマーグループ内のすべてのコンシューマーのサブスクリプション関係と消費ロジックは一貫している必要があります。そうしないと、消費の競合が発生し、一部のメッセージで異常な消費が発生する可能性があります。
正しい例
//コンシューマー c1 Consumer c1 = ConsumerBuilder.build(groupA); c1.subscribe(topicA,"TagA"); //コンシューマー c2 Consumer c2 = ConsumerBuilder.build(groupA); c2.subscribe(topicA,"TagA");正しくない例
//コンシューマー c1 Consumer c1 = ConsumerBuilder.build(groupA); c1.subscribe(topicA,"TagA"); //コンシューマー c2 Consumer c2 = ConsumerBuilder.build(groupA); c2.subscribe(topicA,"TagB");
消費モードが LITE_SELECTIVE の場合
消費モードが LITE_SELECTIVE の場合、同じコンシューマーグループ内の異なるコンシューマーは、Lite Topic の異なるコレクションをサブスクライブできます。次の図に示すように、コンシューマー 1 は LiteTopic1 と LiteTopic2 をサブスクライブし、コンシューマー 2 は LiteTopic3 と LiteTopic4 をサブスクライブします。
Lite Topic は、各コンシューマーのサブスクリプションコレクションに対して、リアルタイムで動的に追加または削除できます。
