サブスクリプション
このセクションでは、Apache RocketMQにおけるサブスクリプションの定義、モデル関係、内部属性、および使用上の注意について説明します。
定義
サブスクリプションとは、Apache RocketMQでコンシューマーがメッセージを取得して処理するためのルールとステータス設定です。
サブスクリプションは、コンシューマーグループによってブローカーに動的に登録されます。その後、メッセージはサブスクリプションで定義されたフィルタールールに基づいてマッチングされ、消費されます。
サブスクリプションを構成することで、以下のメッセージング動作を制御できます。
メッセージフィルタールール:これらのルールは、トピック内のどのメッセージがコンシューマーによって消費されるかを定義するために使用されます。メッセージフィルタールールを構成することにより、コンシューマーは必要なメッセージを効果的に取得し、さまざまなビジネスシナリオに基づいてメッセージ受信範囲を指定できます。詳細については、「メッセージフィルタリング」を参照してください。
消費ステータス:デフォルトで、Apache RocketMQブローカーは永続的なサブスクリプションを提供します。つまり、コンシューマーグループがブローカーをサブスクライブした後、グループ内のコンシューマーは、再接続後も中断した場所からメッセージの消費を継続できます。
サブスクリプションを決定するルール
Apache RocketMQのサブスクリプションは、コンシューマーグループとトピックに基づいて設計されています。そのため、サブスクリプションとは、特定のコンシューマーグループによるトピックへのサブスクリプションを指します。以下に、サブスクリプションを決定するルールを示します。
1つのトピックに対する複数のサブスクライバー:以下の図は、2つのコンシューマーグループ(グループAとグループB)がトピックAをサブスクライブしている様子を示しています。これらの2つのサブスクリプションは互いに独立しており、個別に定義できます。
1つのサブスクライバーに対する複数のトピック:以下の図は、1つのコンシューマーグループ(グループA)が2つのトピック(トピックAとトピックB)をサブスクライブしている様子を示しています。グループAのコンシューマーは、トピックAとトピックBにそれぞれ個別のサブスクリプションを持っています。これらの2つのサブスクリプションは互いに独立しており、個別に定義できます。
モデル関係
以下の図は、Apache RocketMQのドメインモデルにおけるサブスクリプションの位置を示しています。
メッセージはプロデューサーによって初期化され、Apache RocketMQサーバーに送信されます。
メッセージは、Apache RocketMQサーバーに到着した順序で、トピックの指定されたキューに格納されます。
コンシューマーは、指定されたサブスクリプション関係に基づいて、Apache RocketMQサーバーからメッセージを取得して消費します。
内部属性
フィルタの種類
定義:メッセージフィルタールールの種類。サブスクリプションにメッセージフィルタールールを設定すると、システムはフィルタールールに基づいてトピック内のメッセージを照合します。条件を満たすメッセージのみがコンシューマーに配信されます。この機能は、お客様の要件に基づいてコンシューマーに送信されるメッセージを分類するのに役立ちます。
値
タグフィルタ:タグ文字列に基づいて全文をフィルタリングして照合します。
SQL92フィルタ:SQL構文に基づいてメッセージ属性をフィルタリングして照合します。
フィルタ式
定義:カスタムフィルタールールの式。
値:詳細については、「フィルタ式の構文」を参照してください。
動作上の制約
サブスクリプションの一貫性
Apache RocketMQは、コンシューマーグループに基づいてサブスクリプションを管理します。そのため、同じコンシューマーグループ内のコンシューマーは、同じ消費ロジックを維持する必要があります。そうでなければ、消費の競合が発生し、一部のメッセージが誤って消費される原因となります。
正しい例
//Consumer c1
Consumer c1 = ConsumerBuilder.build(groupA);
c1.subscribe(topicA,"TagA");
//Consumer c2
Consumer c2 = ConsumerBuilder.build(groupA);
c2.subscribe(topicA,"TagA");
誤った例
//Consumer c1
Consumer c1 = ConsumerBuilder.build(groupA);
c1.subscribe(topicA,"TagA");
//Consumer c2Consumer
c2 = ConsumerBuilder.build(groupA);
c2.subscribe(topicA,"TagB");
使用上の注意
サブスクリプションは頻繁に変更しないでください。
Apache RocketMQでは、サブスクリプションは、フィルタールールや消費状況などのメタデータと構成に関連付けられています。システムはまた、コンシューマーグループ内のすべてのコンシューマーの消費動作、消費ロジック、および負荷ポリシーが整合していることを保証する必要があります。これらの要因により、管理が必要な複雑な関係のネットワークが生じます。したがって、本番環境でビジネスロジックを変更するためにサブスクリプションを定期的に変更することはお勧めしません。そうでなければ、クライアントは継続的に負荷分散を調整する必要があり、メッセージ受信の問題を引き起こします。