メッセージ
このセクションでは、Apache RocketMQにおけるメッセージの定義、モデルの関係、内部属性、および動作制約について説明します。このトピックでは、メッセージの使い方の注意点も説明します。
定義
メッセージは、Apache RocketMQにおけるデータ送信の最小単位です。プロデューサーは、ビジネスデータのペイロードと拡張属性をメッセージにカプセル化し、Apache RocketMQブローカーに送信します。次に、ブローカーは関連するセマンティクスに基づいて、メッセージをコンシューマーに配信します。
Apache RocketMQのメッセージモデルの特徴は以下のとおりです。
- 不変性: メッセージは生成されたイベントです。メッセージが生成された後、メッセージの内容は変更されません。メッセージが伝送チャネルを通過しても、メッセージの内容は同じままです。コンシューマーが取得するメッセージは読み取り専用メッセージです。
- 永続性: デフォルトでは、Apache RocketMQはメッセージを永続化します。受信したメッセージは、システム障害が発生した場合にメッセージを追跡および復元できるように、Apache RocketMQブローカーのストレージファイルに保存されます。
モデルの関係
次の図は、Apache RocketMQのドメインモデルにおけるメッセージの位置を示しています。
メッセージはプロデューサーによって初期化され、Apache RocketMQブローカーに送信されます。
メッセージは、Apache RocketMQブローカーで受信した順にキューに保存されます。
コンシューマーは、指定されたサブスクリプションに基づいて、Apache RocketMQブローカーからメッセージを取得および消費します。
内部属性
システム保持属性
トピック名
定義: メッセージが属するトピックの名前。トピック名はクラスター内でグローバルに一意です。詳細については、トピックを参照してください。
値: クライアントのSDKから取得。
メッセージタイプ
定義: メッセージのタイプ。
値: クライアントのSDKから取得。Apache RocketMQは、次のメッセージタイプをサポートしています。
Normal: 通常のメッセージ。通常のメッセージは、特別なセマンティクスを必要とせず、他の通常のメッセージとは相関関係がありません。
FIFO: FIFOメッセージ。Apache RocketMQは、メッセージグループを使用して、指定されたメッセージセットの順序を決定します。メッセージは送信された順に配信されます。
Delay: 遅延メッセージ。遅延を指定することで、メッセージが生成されたときにすぐに配信するのではなく、遅延が経過した後にのみコンシューマーがメッセージを利用できるようにすることができます。
Transaction: トランザクションメッセージ。Apache RocketMQは分散トランザクションメッセージをサポートしており、データベースの更新とメッセージ呼び出しのトランザクション整合性を保証します。
メッセージキュー
定義: メッセージが属するキュー。詳細については、メッセージキューを参照してください。
値: ブローカーによって指定および設定されます。
メッセージオフセット
定義: 現在のメッセージがキューに保存されている場所。詳細については、動作メカニズムを参照してください。
値: ブローカーによって指定および設定されます。有効な値: 0〜Long.Max。
メッセージID
定義: メッセージの一意の識別子。各メッセージのIDはクラスター内でグローバルに一意です。
値: プロデューサークライアントによって自動的に生成されます。メッセージIDは、数字と大文字で構成される32文字の文字列です。
(オプション) メッセージキー
定義: メッセージのインデックスキーのリスト。さまざまなキーを設定して、メッセージを区別し、メッセージをすばやく見つけることができます。
値: プロデューサークライアントによって定義されます。
(オプション) メッセージタグ
定義: メッセージをフィルタリングするために使用されるタグ。コンシューマーはタグでメッセージをフィルタリングし、指定されたタグを含むメッセージのみを受信できます。
値: プロデューサークライアントによって定義されます。
制約: 各メッセージに対して指定できるタグは1つだけです。
(オプション) スケジュールされた時間
定義: スケジュールされた時間シナリオでメッセージが遅延配信をトリガーするときに使用されるミリ秒レベルのタイムスタンプ。詳細については、遅延メッセージを参照してください。
値: メッセージプロデューサーによって定義されます。
制約: 最大期間は40日間です。
メッセージ送信時間
定義: メッセージが送信されたときのプロデューサークライアントのローカルミリ秒レベルのタイムスタンプ。
値: プロデューサークライアントによって設定されます。
注: クライアントの時間がブローカーの時間と異なる場合があります。この場合、メッセージ送信時間はクライアントの時間に基づきます。
メッセージ格納タイムスタンプ
定義: メッセージが格納されたときのApache RocketMQブローカーのローカルミリ秒レベルのタイムスタンプ。
遅延メッセージとトランザクションメッセージの場合、メッセージ保持時間は、メッセージが有効になったときにコンシューマーに表示されるブローカー時間です。
値: ブローカーによって設定されます。
注: クライアントの時間がブローカーの時間と異なる場合があります。この場合、メッセージ保持時間はブローカーの時間に基づきます。
再試行回数
定義: メッセージの消費に失敗した後、Apache RocketMQブローカーがメッセージを再配信する回数。再試行するたびに、最大再試行回数が1つずつ増えます。詳細については、消費の再試行を参照してください。
値: ブローカーによってラベル付けされます。メッセージが最初に消費されるとき、再試行回数はゼロです。メッセージが最初に消費に失敗したとき、再試行回数は1です。
メッセージのカスタム属性
カスタム属性
定義: プロデューサーによって指定できる拡張情報。
値: 文字列のキーと値のペアに基づいてプロデューサーによって指定されます。
メッセージペイロード
定義: サービスメッセージの実際のメッセージデータ。
値: プロデューサーによってシリアライズされ、バイナリバイトで送信されます。
制約: パラメーター制限を参照してください。
動作制約
メッセージのサイズは上限を超えることはできません。メッセージのサイズが対応する上限を超えると、メッセージの送信に失敗します。
以下に、メッセージのデフォルトの制限について説明します。
- メッセージの最大サイズ: 4 MB
使用上の注意
単一のメッセージに対して過負荷の送信は推奨されません。
Apache RocketMQは、ビジネスイベントのデータを送信するメッセージングミドルウェアです。メッセージのサイズが大きい場合、ネットワーク伝送レイヤーが過負荷になる可能性があります。これは、エラー時の再試行とスロットリングに影響します。単一のメッセージイベントのデータサイズを制限することをお勧めします。
本番環境で過負荷の送信が必要な場合は、固定サイズに基づいてメッセージを分割するか、ファイルストレージメソッドを使用することをお勧めします。
メッセージの不変性
Apache RocketMQブローカーバージョン5.xではメッセージを変更できず、コンシューマーが取得するメッセージは読み取り専用メッセージです。バージョン3.xおよび4.xでは、不変性に関連する強い制約は課されていません。メッセージを送信する場合は、メッセージを再初期化することをお勧めします。
正しい例
Message m = Consumer.receive();
Message m2= MessageBuilder.buildFrom(m);
Producer.send(m2);
誤った例:
Message m = Consumer.receive();
m.update();
Producer.send(m);