すべてのプロダクト
Search
ドキュメントセンター

ApsaraMQ for RocketMQ:蓄積メッセージの処理

最終更新日:Mar 12, 2026

ApsaraMQ for RocketMQ インスタンスでメッセージ蓄積アラートがトリガーされると、リアルタイム蓄積メッセージ数 の値が グループ詳細 ページで想定より高くなります。また、メッセージトレース ページでは、メッセージがブローカーに公開されているものの、コンシューマーへの配信が完了していない状態として表示されます。

以下の手順に従って、蓄積の根本原因を特定し、問題を解決してください。

メッセージが蓄積する理由

メッセージがブローカーに送信された後、コンシューマークライアントはコンシューマオフセットに基づいてメッセージをプルします。蓄積は、クライアントがメッセージを十分な速度で消費できない場合に発生します。主な原因は以下の 2 つです:

  • 消費時間の長さ — 消費スレッド内のビジネスロジックが、1 件のメッセージあたり過度に長い時間を要しています。

  • スレッド同時実行数の不足 — 受信メッセージのレートに対応できるだけの消費スレッド数が確保されていません。

詳細については、「メッセージ蓄積とレイテンシ」をご参照ください。

トラブルシューティング

ステップ 1:メッセージ蓄積の発生場所を特定

クライアントの ons.log ファイルを確認し、以下のログメッセージを探します:

the cached message count exceeds the threshold
  • ログメッセージが検出された場合 — クライアント側バッファーキューが満杯です。メッセージはクライアント側で蓄積しています。ステップ 2 に進んでください。

  • ログメッセージが検出されなかった場合 — メッセージはクライアント側で蓄積していません。お問い合わせは Alibaba Cloud テクニカルサポート までご連絡ください。

ステップ 2:メッセージ消費時間の確認

1 件のメッセージあたりの消費時間が異常に長い場合は、根本原因はビジネスロジックにある可能性が高いです。ステップ 3 に進み、スレッドスタックを確認してください。

消費時間が正常な場合は、スレッド同時実行数の不足が蓄積の原因です。以下の対応を行ってください:

  • 消費スレッド数を増加させます。

  • コンシューマーノードを追加してスケールアウトします。

消費時間の確認方法

以下のいずれかの方法をご利用ください:

  • メッセージトレースApsaraMQ for RocketMQ コンソール にログインし、メッセージトレース ページを開き、クエリタスクの作成 をクリックします。メッセージ ID によるクエリ を選択して該当メッセージを特定し、コンシューマー セクションの 消費時間 の値を確認します。詳細については、「メッセージトレースのクエリ」をご参照ください。

    Consumption time

  • グループ詳細グループ詳細 ページで クライアント接続情報 セクションを確認し、対象クライアントの 操作 列から 詳細表示 をクリックします。応答時間 (ms/メッセージ) フィールドに、1 件のメッセージあたりの平均消費時間が表示されます。詳細については、「コンシューマー詳細の表示」をご参照ください。

    Consumption status

  • モニタリングサービスApplication Real-Time Monitoring Service (ARMS) またはその他のモニタリングソリューションを用いて、消費時間のメトリックを収集します。

ステップ 3:ConsumeMessageThread スタックの確認

ConsumeMessageThread スレッドにはメッセージ消費ロジックが含まれており、そのスタックを確認することで、ブロッキング呼び出し、過剰なスリープ、外部 I/O の遅延など、ボトルネックを特定できます。

スレッド状態の解釈方法については、Java Thread.State ドキュメント をご参照ください。

スレッドスタックの取得方法

オプション A:ApsaraMQ for RocketMQ コンソール

グループ詳細 ページで クライアント接続 セクションを確認し、対象クライアントの 操作 列から スタック情報の表示 をクリックします。詳細については、「コンシューマー詳細の表示」をご参照ください。

オプション B:ホストでの jstack 実行

  1. 蓄積メッセージを持つコンシューマーインスタンスが実行されているホストにログインします。ホスト IP の確認方法については、「コンシューマーのステータスの表示」をご参照ください。

  2. Java プロセス ID を特定します:

       ps -ef | grep java
       jps -lm
  3. スレッドスタックをダンプします:

       jstack -l <pid> > /tmp/<pid>.jstack
  4. ConsumeMessageThread のエントリをフィルタリングします:

       cat /tmp/<pid>.jstack | grep ConsumeMessageThread -A 10 --color

代表的なスタックパターン

アイドルスレッド(蓄積なし)

消費スレッドは WAITING 状態であり、クライアント側バッファーキューからメッセージをプルするのを待機しています。これは、消費対象のメッセージがない場合の正常な動作です。

Idle stack

スリープまたはロック競合によるスレッドブロッキング

消費スレッドが sleep() 呼び出しでブロックされており、消費が遅延しています。

Blocked stack - sleep

外部 I/O によるスレッドブロッキング

消費スレッドが外部 HTTP 呼び出しやデータベース操作でブロックされており、消費が遅延しています。

Blocked stack - external I/O

ステップ 4:蓄積メッセージのスキップ(任意)

蓄積したメッセージがもはや関連性を失っており、安全にスキップ可能である場合、コンシューマオフセットを最新位置にリセットします。これにより、コンシューマーは最新のメッセージから消費を開始し、蓄積分をスキップします。

手順については、「コンシューマオフセットのリセット」をご参照ください。

警告

コンシューマオフセットをリセットすると、すべての蓄積メッセージがスキップされます。実行前に、これらのメッセージが今後不要であることを必ず確認してください。

次のステップ