メッセージドロップアラート
メッセージドロップアラートは、クライアントセッションのメッセージキューが配信中に満杯になったため、EMQX Cloudがメッセージをドロップしたことを示します。
これは通常、メッセージがサブスクライバーのセッションにルーティングされたものの、クライアントが長時間オフラインのままであったか、メッセージを処理する速度が追いつかなかったことを意味します。セッションキューが制限に達すると、それ以降のメッセージはキューに入れられずドロップされます。
クライアントが長時間オフラインの場合(Clean Session = False)
症状
クライアントがオフラインで Clean Session = False の場合、EMQX Cloudはクライアントが再接続するまで、そのクライアントのセッションメッセージキューにメッセージを格納し続けます。デフォルトの最大長は1,000メッセージです。
クライアントがオフラインのままセッションが期限切れで削除される(MQTT v3ではデフォルト2時間、MQTT v5では session_expiry_interval で指定)か、クライアントが再接続する前にセッションキューが満杯になると、メッセージはドロップされます。
Monitor ページでは、クライアントはオフラインですがセッションは存在し、メッセージキューが制限に達している状態が確認できます。
主な原因
- クライアントが長時間オフラインのままである。
- メッセージが蓄積され、セッションキューの最大長に達している。
- クライアントがランダムな
clientidを使い、Clean Session = Falseのため、再接続時に異なるセッションが作成される。
対処方法
- クライアントがオフライン時にメッセージを必要としない場合は、Clean Session を
Trueに設定し、オフライン中のメッセージ蓄積を防止してください。 - Clean Session を
Falseにする必要がある場合は、自動再接続を実装し、ネットワーク障害後は速やかに再接続してください。 - ランダムな
clientidとClean Session = Falseを組み合わせないでください。クライアントIDが変わるとセッションの再開ができなくなります。
クライアントのメッセージ処理能力不足
症状
クライアントがサブスクライブしているすべてのトピックは、1つの固定長セッションメッセージキューを共有しており、デフォルトの最大長は1,000メッセージです。高ボリュームのトピックがクライアントの処理速度を上回ると、キューが満杯になり、それ以降のメッセージがドロップされます。
Monitor ページでは、クライアントはオンラインで、セッション詳細に Message Queue Full (1000 / 1000) と表示されます。
主な原因
- クライアントのメッセージ消費速度が生成速度に追いついていない。
- 1つのクライアントが多くの高ボリュームトピックをサブスクライブしている。
対処方法
- クライアントを最適化し、メッセージ処理および消費のスループットを向上させてください。
- 共有サブスクリプションを利用して、複数のクライアントにメッセージを分散してください。詳細は共有サブスクリプションを参照してください。
トラブルシューティング
EMQX Cloudコンソールにログインします。
Deployment Logs を開き、Error Type を Messages に設定し、以下のようなメッセージドロップのエントリを探します。
textclientid: device001, peername: xx.xx.xx.xx:23853, username: test, topic: t/test, pid: <0.13552.0>, payload: 61616161616161616161, payload_encode: hex, queue: {"store_qos0":true,"max_len":1000,"len":1000,"dropped":91530}, msg: dropped_msg_due_to_mqueue_is_fullログエントリから
clientidを控えます。Monitor -> Clients に移動し、
clientidを検索してセッション状態を確認します。クライアントがオフラインでセッションが存在する場合は、「クライアントが長時間オフライン」のシナリオを調査してください。

クライアントがオンラインでセッションメッセージキューが満杯の場合は、「クライアントのメッセージ処理能力不足」を調査してください。

Monitor -> Clients にセッションが表示されない場合は、クライアントログと Clean Session(Clean Start)設定を確認してください。
- 設定が
Trueの場合、メッセージドロップは通常クライアントの処理能力不足を示します。 - 設定が
Falseの場合は、クライアントの切断ログを比較し、長時間オフラインであったかを判断してください。
- 設定が
モニタリングと統計
EMQX Cloudコンソールの Metrics -> Timeline -> Dropped Messages で、時間経過に伴うドロップメッセージの総数を監視できます。

メッセージドロップイベントの追跡
EMQX Cloudは、過去のセッションキューの完全な内容やドロップされたメッセージのすべてのデータを保持しません。
ログには選択されたフィールドのみが含まれ、
payloadは切り詰められている場合があります。記録されるフィールドにはclientid、peername、username、topic、payloadがあります。メッセージドロップを時間経過で追跡するには、
$events/delivery_droppedイベントトピックのデータ統合ルールを作成し、イベントを転送または保存してください。例:sqlSELECT * FROM "$events/delivery_dropped"clientidやtopicなどのフィールドでフィルタリングも可能です。詳細はSQLデータソースとフィールドを参照してください。