トピック
このセクションでは、Apache RocketMQにおけるトピックの定義、モデル関係、内部属性、および動作制約について説明します。また、このトピックでは、トピックのバージョン互換性情報と使用上の注意についても説明します。
定義
トピックは論理的にはキューの集合であり、メッセージをパブリッシュしたり、そこから受信したりできます。
トピックには、次の利点があります
- メッセージの分類とメッセージの分離:Apache RocketMQに基づいてメッセージングサービスを作成する場合、異なるビジネスタイプのメッセージを、分離されたストレージとサブスクリプションのために、異なるトピックを使用して管理することをお勧めします。
- IDと権限の管理:Apache RocketMQのメッセージは匿名です。特定のカテゴリのメッセージに対して、トピックを使用してIDと権限の管理を実行できます。
モデルの関係
次の図は、Apache RocketMQのドメインモデルにおけるトピックの位置を示しています。
Apache RocketMQでは、トピックはすべてのメッセージリソースが定義されている最上位のストレージコンテナです。トピックは論理的な概念であり、メッセージを格納する実際の単位ではありません。
トピックには1つ以上のキューが含まれています。メッセージのストレージとスケーラビリティは、キューに基づいて実装されます。トピックのすべての制約と属性設定は、トピック内のキューに基づいて実装されます。
内部属性
トピック名
定義:トピックの名前。トピック名はトピックを識別し、クラスター内でグローバルに一意です。
値:トピック名は、トピックが作成されるときにユーザーによって指定されます。
制約:パラメータ制限を参照してください。
キュー
定義:メッセージを格納する実際のストレージ単位。トピックには1つ以上のキューが含まれています。詳細については、メッセージキューを参照してください。
値:トピックを作成するときにキューの数を指定できます。Apache RocketMQは、指定された数のキューをトピックに割り当てます。
制約:トピックには少なくとも1つのキューが含まれている必要があります。
メッセージタイプ
定義:トピックに指定されているメッセージタイプ。
値:Apache RocketMQでトピックを作成するときは、トピックに次のメッセージタイプのいずれかを選択します。
通常:通常のメッセージ。通常のメッセージは、特別なセマンティクスを必要とせず、他の通常のメッセージとは相関関係がありません。
FIFO:FIFOメッセージ。Apache RocketMQはメッセージグループを使用して、指定されたメッセージセットの順序を決定します。メッセージは、送信された順序で配信されます。
遅延:遅延メッセージ。遅延を指定して、メッセージが生成されるとすぐに配信するのではなく、遅延時間が経過した後にのみコンシューマーがメッセージを利用できるようにすることができます。
トランザクション:トランザクションメッセージ。Apache RocketMQは、分散トランザクションメッセージをサポートし、データベースの更新とメッセージ呼び出しのトランザクション整合性を確保します。
制約:バージョン5.0以降、Apache RocketMQはメッセージタイプの検証の強制をサポートしています。つまり、各トピックでは、単一のタイプのメッセージのみを送信できます。これにより、本番システムの運用と管理がより容易になり、混乱を回避できます。ただし、バージョン4.xとの下位互換性を確保するために、検証機能はデフォルトで有効になっています。
動作制約
メッセージタイプの強制検証
Apache RocketMQバージョン5.xでは、トピックにメッセージタイプを指定できます。これにより、指定されたタイプのメッセージを別のトピックで管理および処理できます。Apache RocketMQは、送信されるメッセージのタイプと、メッセージが送信されるトピックのメッセージタイプを強制的に検証します。メッセージタイプの検証に失敗した場合、メッセージ配信リクエストは拒否され、タイプミスマッチエラーが返されます。次の検証ルールが適用されます
一貫性のあるメッセージタイプ。送信するメッセージは、メッセージを送信するトピックに指定されているメッセージタイプと同じメッセージタイプを使用する必要があります。
トピックに送信されるメッセージは1つのタイプのみ。トピックに送信するメッセージは、同じメッセージタイプを使用する必要があります。トピックに指定できるメッセージタイプは1つだけです。
バージョン4.xとの下位互換性を確保するため、上記の検証機能はデフォルトで無効になっています。サーバーパラメータ「enableTopicMessageTypeCheck」を使用して検証を有効にすることをお勧めします。
一般的な使用エラーの例
トピックのメッセージタイプと一致しないメッセージを送信する。たとえば、FIFOメッセージタイプを使用するトピックにトランザクションメッセージを送信するリクエストが開始されると、拒否され、タイプミスマッチエラーが返されます。
異なるタイプのメッセージをトピックに送信する。たとえば、通常のメッセージタイプを使用するトピックに通常のメッセージとFIFOメッセージを送信するリクエストが開始されると、拒否され、タイプミスマッチエラーが返されます。
バージョン互換性
メッセージタイプの強制検証は、Apache RocketMQバージョン5.xでのみ利用可能です。Apache RocketMQバージョン4.xおよび3.xのSDKは、メッセージタイプの強制検証をサポートしていません。バージョン4.xまたは3.xを使用する場合は、メッセージタイプが一貫していることを確認してください。
Apache RocketMQバージョン5.xを使用することをお勧めします。
使用例
Apache RocketMQ 5.0でトピックを作成するには、mqadminツールを使用することをお勧めします。ただし、メッセージタイプをプロパティパラメータとして追加する必要があることに注意してください。以下に例を示します
sh mqadmin updateTopic -n <nameserver_address> -t <topic_name> -c <cluster_name> -a +message.type=<message_type>
この中で、message_typeパラメータは、メッセージタイプに基づいてNormal/FIFO/Delay/Transactionとして設定できます。指定しない場合、デフォルトはNormalタイプになります。
使用上の注意
ビジネス要件に基づいてトピックを計画する
Apache RocketMQでトピックを計画するときは、ビジネスの同じビジネスモジュールに対して生成されたメッセージを処理するためにトピックを使用することをお勧めします。トピックを計画する際は、次の要因に注意してください
メッセージタイプ:異なるタイプのメッセージを格納するには、異なるトピックを使用します。たとえば、FIFOメッセージと通常のメッセージを個別に格納するために、2つのトピックを作成できます。
メッセージの相関関係:直接相関関係のないメッセージを格納するには、別のトピックを使用します。たとえば、相関関係のない淘宝網トランザクションメッセージと盒馬物流メッセージ用に2つのトピックを作成します。メッセージが直接相関している場合は、同じトピックを使用できます。たとえば、淘宝網の紳士服カテゴリと婦人服カテゴリに対して生成された注文メッセージ用に1つのトピックを作成できます。ビジネスボリュームまたはサブモジュールで、よりきめ細かいトピックが必要な場合は、1つのトピックに分類できるメッセージに異なるトピックを使用することもできます。
メッセージの量と時間的制約:量や時間的制約に違いがあるメッセージを処理するには、異なるトピックを使用します。たとえば、少数の時間依存メッセージを生成するビジネスと、数兆のメッセージを生成する別のビジネスに同じトピックを使用しないでください。これにより、時間依存メッセージが消費されるのを長く待つことがなくなります。
正しいトピック計画の例:eコマースのシナリオでは、注文作成、支払い、キャンセルなどの注文関連メッセージ用のトピック、物流メッセージ用のトピック、および報酬ポイント関連メッセージ用の別のトピックを使用できます。
誤ったトピック計画の例
粒度が粗すぎる:分離が不十分になります。これにより、独立したO&Mと障害処理が容易になりません。この誤ったトピック計画の実践例は、すべてのトランザクションメッセージと物流メッセージに同じトピックを使用することです。
粒度が細かすぎる:大量のトピックリソースを消費し、システム負荷が増加します。この誤ったトピック計画の実践例は、各ユーザーに対して生成されたメッセージに個別のトピックを使用することです。
同じタイプのメッセージを送受信するには、トピックを使用します
トピックベースのビジネス分離は、Apache RocketMQ の設計原則です。異なるビジネスロジックを使用するメッセージには、異なるトピックを使用することを推奨します。特定のトピックは、同じタイプのメッセージを送受信する必要があります。
トピックの自動管理は避ける
Apache RocketMQ のトピックは、独立した権限管理、可観測性メトリクスの収集、監視機能を提供する最上位のリソースおよびコンテナです。トピックの作成と管理にはシステムリソースが必要です。本番環境では、操作が必要な場合にのみトピックの追加、削除、変更、またはクエリを行うことを推奨します。
Apache RocketMQ はトピックの自動作成機能を提供していますが、テスト環境でのみこの機能を使用することを推奨します。本番環境でこの機能を使用すると、多数の不要なトピックが生成される可能性があります。これはトピックの管理を妨げ、追加のシステムリソースを消費します。