EMQX Enterprise Version 6
6.3.2
リリース日: 2026-10-16
改善点
Core MQTT 機能
- #19438 混雑していない接続において、インメモリセッションは、以前の QoS 1/2 メッセージがアックを待っている場合でも、キューに溜まった QoS 0 メッセージのドレインを楽観的に継続するようになりました。これは混雑が解消された後や既存のセッションが再開した後のドレインも含みます。トピック優先度が有効な場合は、QoS 0 メッセージのドレインが早期に停止する可能性があります。
パフォーマンス
本リリースでは、MQTT 接続、セッション、ノードローカルクライアントデータのメモリ使用量を削減し、複数のブローカーパスにおける CPU オーバーヘッドを低減、サブスクリプションのルックアップおよび起動パフォーマンスを改善しました。
接続およびセッションのメモリ
- #19092 接続は
mqtt.hibernate_after(デフォルトはトラフィックなしで5秒)経過後にハイバネートします。ハイバネートによりプロセスヒープが使用中のデータに縮小され、接続ごとに約5KBのメモリを解放します。以前は TCP/TLS 接続はmqtt.idle_timeout(デフォルト15秒)後にのみハイバネートし、WebSocket 接続は最初のパケット後も起きたままでした。mqtt.hibernate_after = infinityに設定すると接続を起きたままにできますが、クライアントがほぼ同じ間隔で送信する場合は値を上げてください。ハイバネートごとにガベージコレクションが発生し、起床時にヒープが再び増加するためです。 - #19181 ゾーンとリスナーでメッセージ、バイト、サブスクライブのレート制限が設定されていない接続は、レートリミッター状態を割り当てなくなりました。後から制限が設定されると既存接続にも適用されます。
- #19262 パブリッシュ専用クライアントや配信に追いついているサブスクライバーなど、キューにメッセージがないセッションは48バイトのメモリを節約します。
- #19563 Erlang/OTP を 28.4.1-7 に、
emqx-builderを 6.2-3 にアップグレードしました。TLS 接続は共有ソケットオプションで接続ごとの ETS テーブルが不要になりメモリ使用量が減少し、アイドル TLS 1.3 接続は暗号状態を解放します。TLS ハンドシェイク時に絶対パスのcacertfile解決で Erlang ファイルサーバーを2回呼び出すことがなくなり、TLS 接続バースト時のファイルサーバーのバックログを防止します。
- #19092 接続は
ノードローカルクライアントデータ
- #19306 channel-info テーブルはクライアントの遺言メッセージ、CONNECT プロパティ、サブスクリプションリストを保持しなくなりました。これにより、CONNECT パケットやサブスクリプション数に応じてエントリが増大しなくなり、メモリ使用量と SUBACK/UNSUBACK 後のテーブル書き換えコストが減少します。
- #19263 テーブルは
sockinfoマップとconninfoが保持するpeerhost,peerport,peername,sockportを削除し、接続ごとに約100バイト節約します。 - #19303 値が0のクライアント統計情報を保持しなくなり、アイドルクライアントごとに約145バイト節約します。
- #19245 TCP、TLS、WebSocket でサブスクライブするクライアントは subscriber-id テーブルに行を持たなくなり、クライアントごとに約110バイト、100万クライアントで約110MB節約します。
REST API レスポンス、CLI 出力、フックコールバック引数は変更ありません。
emqx_cm:get_chan_info/1,2、emqx_cm:lookup_client/1、emqx_mgmt:lookup_client/2、emqx_channel:info/1、emqx_connection:info/1を通じて直接クライアント情報テーブルを読むプラグインは、返されるマップにwill_msg、conninfo.conn_props、session.subscriptionsを含みません。クライアントのサブスクリプションはemqx_broker:subscriptions/1、CONNECT プロパティはclient.connectedフック、単一属性の読み取りはemqx_channel:info/2を使用してください。CPU とレイテンシ
- #19527 メッセージ処理やクライアントライフサイクル操作時のフックは名前で直接呼び出されるようになりました。
- #19516 #19536 メトリックの更新と読み取りに必要なルックアップ数を削減しました。受信・送信した MQTT パケットのメトリック更新は、各名前空間更新グループ内の全カウンターでカウンター参照を再利用します。
- #19528
tcp_backend = socketの TCP リスナーでは、1KB までのパケットで受信ごとのシステムコール回数が減少し、QoS 0 PUBLISH パケットあたりのブローカー CPU 使用率が約7%低下しました。大きなパケットでは同等か低下しています。 - #19532 SUBACK と UNSUBACK 後のクライアントテーブル更新を1回の書き込みにまとめ、高頻度の新規サブスクライブ接続時の SUBSCRIBE レイテンシを低減しました。
- #19555
mriaを 1.0.2 にアップグレード。クラスタテーブルへの書き込みは、呼び出しプロセスのキューに100メッセージ以上ある場合のみヘルパープロセスで実行されるようになり、頻繁なヘルパープロセス待ちを回避して新規サブスクライブの高負荷時のレイテンシを低減しました。 - #19545 リテイナー有効時、ワイルドカードなしトピックフィルターのサブスクライブでリテインメッセージのチェックを最適化し、該当メッセージがなければ以降のリテイン処理を省略して CPU 使用率を低減しました。
サブスクリプションルックアップと起動
バグ修正
Core MQTT 機能
#19489 MQTT TCP リスナーのデフォルト
tcp_backendをgen_tcpに戻しました。6.3.0 で Unix/Linux でのデフォルトが
socketになりましたが、接続ごとのメモリ使用量が増加するため、対応が完了するまでデフォルトをgen_tcpに戻します。メッセージトラフィックなしの接続でのみコストが測定されており、トラフィックありのテストでは未確認です。socketは v7 で再びデフォルトになる予定です。socketバックエンドは変更なく、Unix/Linux でtcp_backend = socketと設定すれば利用可能です。明示的に設定したリスナーは影響を受けません。デフォルトに依存するリスナーはgen_tcpに切り替わり、アップグレード時に再起動されてアクティブな接続は切断されます。#19298 6.3.0 で導入されたパフォーマンス低下を修正。
socketバックエンドの TCP リスナーで大規模な QoS 1 メッセージバースト時に高い CPU 使用率と遅いメッセージ配信が発生していました。アウトゴーイングメッセージのバッチ処理でバーストスループットも改善しました。#19326 フルインフライトウィンドウを接続混雑シグナルとして扱わないようにメッセージ配信を改良。QoS 0 メッセージはインフライトウィンドウが満杯でも配信可能になり、不要なキューイングやメッセージドロップを減らしつつ、トピック・QoS レベルごとの順序は保持されます。
また、配信レート制限下での QoS 1/2 メッセージの順序入れ替わりを修正し、送信前のキューイングメッセージが配信クォータを消費しないようにしました。
#19351
esockdを 5.17.4 から 5.17.8 にアップグレードし、以下のリスナー問題を修正しました:socketバックエンドで小さいtcp_options.recbuf値を使うと高 MTU リンクで TCP スループットが著しく低下する問題を修正。- PROXY Protocol v2 のゼロ長プロキシ情報が MQTT データを消費し、切断された IPv4/IPv6 アドレス情報をクラッシュせずに拒否する問題を修正。
- 不完全な PROXY Protocol v1 ヘッダーを
socketバックエンド接続で拒否するように。 - リスナーオプションのマージとソケットチューニングを修正し、未初期化カウンター更新時のアクセプタークラッシュを防止。
#19144 クライアント切断中にセッションレジストリクリーンアップ処理が停止する問題を修正。切断されたクライアントをスキップして古い登録を継続的に削除します。
#19316 リミッター登録が再起動されたりノードがクリーンアップなしでシャットダウンされた際に、
persistent_termにレートリミッターのバケットエントリがリークする問題を修正。
ゲートウェイ
#19422 MQTT-SN セッションテイクオーバーが混在バージョンクラスターで失敗する問題を修正。異なるバージョンのノードで再接続やウェイクアップするとクライアントチャネルがクラッシュし、セッション再開や保留メッセージ配信が阻害されていました。
#19459 MQTT-SN ゲートウェイが送信する PUBLISH パケットから
DUPとRETAINフラグが抜けていた問題を修正。クライアントは再送メッセージやサブスクライブ時のリテインメッセージを識別可能になりました。#19393 セッションを再開したゲートウェイクライアントへの QoS 1/2 配信時に毎回エラーログが出る問題を修正。
メッセージキューやストリーム使用時に、フックコールバック内で例外が発生し、
hook_callback_exceptionがエラーレベルでログに記録されていました。配信自体には影響ありません。セッション再開時のゲートウェイチャネルはセッションライフサイクルフックを実行しないため、コールバックに必要なチャネルメタデータが設定されていませんでした。
アクセス制御
- #19282
hostname_resolution = dynamicの HTTP 認証で、Content-Typeヘッダー名が小文字でないレスポンスを拒否していた問題を修正。例えばContent-Type: application/jsonは許容されます。以前は認証バックエンドがunsupported_content_typeを返し、クライアント接続ができませんでした。
データ統合
#19313 HTTP ベースコネクター(HTTP Server、GCP PubSub Producer、Couchbase、Snowflake)で応答なし接続検出を改善。
修正前は、応答待ちリクエストがある接続は
resource_opts.request_ttl(リクエストタイムアウト)+max_inactive経過後に再接続されていました。request_ttlが大きいと再接続まで長時間かかり、infinityの場合は再接続されませんでした。修正後は、リクエスト待ちがあり送信リクエストが60秒間ない場合、または
max_inactiveがそれより長い場合はmax_inactive経過後に再接続されます。デフォルト設定(request_ttl45秒、max_inactive10秒)は影響を受けません。これにより、
request_ttlが約50秒以上のコネクターで挙動が変わります。60秒以上かかる応答は再接続で中断される可能性があります。リモートサービスが60秒以上かかる場合はmax_inactiveを最長応答時間以上に設定してください。
オブザーバビリティ
- #19561 ログハンドラが
payload_encode = hiddenを設定した場合のログフォーマッタクラッシュを修正。以前は Cluster Linking のrecv_dataイベントのdataフィールドなど、タームフィールドを含むデバッグログがFORMATTER CRASHレポートに置き換わっていました。現在はEncoded(hidden)=******としてマスクされ、通常通りログが書き込まれます。
ノードとクラスター
#19444 CPU クォータ下(例:
docker run --cpus、Kubernetes CPU 制限)での Erlang スケジューラ数を修正。6.3.0 以降、EMQX はホストの CPU コア数分のスケジューラを起動していましたが、コンテナが使用可能なコア数が少ない場合でも同様でした。スケジューラが CPU クォータを奪い合い、同じメッセージレートで約30%多く CPU を使用していました。現在は CPU クォータに応じたスケジューラ数を起動します。明示的に設定する場合は
node.schedulersを使用してください。#19160 コアノードがクラスターに参加・離脱する際の
mriaアプリケーションのクラッシュを修正。textReason: {badarg,[{ets,select,[gproc,[{{{{n,l,{mria_rlog_replica,route_shard_m,'$1'}},n},'$2','_'},[],[{{'$1','$2'}}]]],[{error_info,#{cause => id...この修正で、
mriaアプリケーションのgproc依存をクラスターノード変更時に再起動されるビジネスレベルアプリケーションのリストから除外しました。#19578 ローリングアップグレード時に避難されたセッションのインポート中に発生するクラッシュを修正。セッションが旧バージョンのノード由来でリスナーメタデータが欠落している場合に発生していました。
#19580 ローリングアップグレード中にノード避難が完了しない可能性のある問題を修正。
- ソースノードバージョン: EMQX 5.8~5.10、6.0.0~6.0.3、6.1.0~6.1.4、6.2.0~6.2.3、6.3.0
- 宛先ノードバージョン: EMQX 6.0.4、6.1.5、6.3.1
- 影響: 宛先ノードがセッション強制退去呼び出しに応答せず、ソースノードがクライアントセッションを保持し続けて無限に再試行していました。
- 解決: EMQX ノードは呼び出しに再び応答し、ノード避難が完了するようになりました。
パッケージング
- #19141 Docker イメージの
/etc/passwdにrootエントリを復元し、docker run --user rootが再び動作するようにしました。6.3.1 でイメージがハードニングされたベースに移行した際に削除され、数値形式の--user 0:0のみが動作していました。
6.3.1
リリース日: 2026-09-17
EMQX 6.3.1 へのアップグレード前に破壊的変更を必ずご確認ください。
改善点
アクセス制御
#18777 Dashboard JSON API ログインに SCRAM-SHA-256 チャレンジレスポンス認証をオプションで追加し、埋め込み API Spec ログインページのデフォルトを SCRAM に切り替えました。既存のパスワードログインはデフォルトで有効のままです。
dashboard.password_login = scram_onlyの場合、ユーザー名とパスワードでPOST /api/v5/loginを使うスクリプトやサードパーティクライアントは SCRAM チャレンジレスポンスフローに移行するか API キーを使用する必要があります。
パッケージング
#18977 公式 EMQX Enterprise Docker リリースイメージを Docker Hardened Debian 13 (Trixie) に切り替えました。ランタイムイメージからは
aptやdpkgなどのパッケージマネージャーが除外されています。リリースイメージにはビルド由来情報とソフトウェア部品表(SBOM)証明書が含まれ、Docker Scout によるハードニングベースイメージの脆弱性評価(VEX ステートメント)適用が可能になりました。
パフォーマンス
#18806 MQTT 接続のメモリ使用量を削減。
接続時にレートリミッター状態を割り当てていましたが、レート制限が設定されていない場合でも割り当てていました。現在はクライアントが初めてパブリッシュまたはサブスクライブした際に割り当てるため、接続のみの状態では約2KBのメモリ節約になります。設定済みのレート制限は従来通り動作します。
#18807 MQTT セッションのメモリ使用量を削減。
配信レート制限が設定されていない場合でも配信レートリミッター状態を割り当てていましたが、現在は配信レート制限が設定された後の最初の配信時に割り当てます。セッションごとに約0.5KB節約されます。設定済みの配信レート制限は従来通り動作します。
#18808 パブリッシュまたはサブスクライブする MQTT 接続のメモリ使用量を削減。
接続ごとのレートリミッター状態は、実際に設定されたレート制限に対してのみ割り当てられます。デフォルト設定(レート制限なし)ではアクティブ接続ごとに約1.6KB節約されます。設定済みのレート制限は従来通り動作し、ランタイム追加も対応します。
#18809 レート制限が設定されている MQTT 接続のメモリ使用量を削減。
全接続で共有されるレートリミッターの管理情報は接続ごとにコピーされなくなり、レート制限有効時に接続ごとに約0.5KB節約されます。レート制限の動作は変更ありません。
#18875 マルチテナントネームスペースに属する MQTT 接続のメモリ使用量を削減。
テナントクライアントのレートリミッター状態は、クライアントが初めてパブリッシュ、サブスクライブ、またはメッセージ受信した際に割り当てられ、実際に設定された制限に対してのみ割り当てられます。通常の接続と同様の動作です。設定済みのテナント・クライアントレート制限は従来通り動作します。ネームスペースのリミッター設定が削除された場合、そのクライアントに対するリミッター検査は操作拒否を継続します。
バグ修正
Core MQTT 機能
#18734
tcp_options.buffer = 0がデフォルトのsocketバックエンドで新規接続が失敗する TCP リスナーの問題を修正。tcp_options.active_nは 1..1000 に制限され、tcp_options.bufferは MQTT 固定ヘッダー最大長の5バイト以上に制限されます。範囲外の値は受け入れられますが静かに調整されます。#18789 MQTT とゲートウェイリスナーの作成で、64バイトを超える名前や制限付き名前形式に合わない名前を明確な
BAD_REQUEST応答で拒否するようにしました。既存の長い名前のリスナーは編集可能なままです。#18811 6.3.0 のリグレッションを修正し、トピックエイリアスを受け入れない MQTT v5 クライアントにトピックエイリアスを送信しなくなりました。
Topic Alias Maximumプロパティを省略または0に設定したクライアントに対し、SCRAM などの強化認証で認証された場合でもTopic-Aliasプロパティ付き PUBLISH パケットが送信されていました。#18828 MQTT リスナーは、最初のパケットが CONNECT でない場合、パケット本文を解析せずに接続を閉じるようになりました。
アクセス制御
#18681 API キーを拒否するエンドポイント(例:
POST /api/v5/logout)で、ベアラートークン拒否や認可ヘッダー欠落時に API キー使用を示唆する誤った認証エラーメッセージを修正。api_key.bootstrap_file設定キー名も表示しません。#18724 Dashboard SSO OIDC で、発行者 URL スキームと TLS オプションが矛盾する設定(
httpsで TLS 無効、httpで TLS 有効)を設定時に拒否し、実行時の不明瞭な TLS エラーや TLS オプション無視を防止しました。#18737 認証・認可リクエストテンプレートで
${peerport}が空文字列になる問題を修正。また、
${peername}をクライアント情報に追加。例:192.168.0.1:51544。#18852 6.2 で動作中のノードがローリングアップグレード中にブートストラップ API キーを拒否する問題を修正。
6.3 ノード起動時にクラスタ共有 API キーの秘密ハッシュを書き換え、6.2 ノードが検証できず拒否していました。ブートストラップファイルローダーは、秘密が同じ場合は保存済みハッシュを保持し、ロールやスコープなどのメタデータのみ更新します。
秘密を変更するとハッシュは置き換えられます。クラスタ全体が 6.3 になってからブートストラップ秘密をローテーションしてください。
#18904 Dashboard SSO バックエンドのリソースが開始タイムアウトまで
connecting状態のままの場合に、リソースの作成・更新が内部エラーで失敗する問題を修正。バックエンドはリソース ID で追跡され、開始タイムアウト後にクリーンアップされます。
マルチテナンシー
- #18774 リソースクリーンアップ中に削除済みマルチテナンシーネームスペースにクライアントが接続できる問題を修正。
データ統合
- #18763 TDengine アクションのエラー報告を修正。アクションが見つからない場合、アクション ID ではなくコネクター ID を名前に含めていました。
監視
#18664 ネームスペース付きリクエストの監査ログに対象ネームスペースを記録。以前は異なるネームスペースの同名トピックメトリクスコレクションのリセットが区別できませんでした。クエリパラメータも記録されます。
#18677 データバックアップリクエストの監査ログに対象ネームスペースを記録。以前は異なるネームスペースのバックアップ操作が区別できませんでした。クエリパラメータも記録されます。
#18678 A2A レジストリリクエストの監査ログに対象ネームスペースを記録。以前は異なるネームスペースのエージェントカード操作が区別できませんでした。クエリパラメータも記録されます。
#18684 OpenTelemetry トレース有効時に MQTT 5 クライアントの CONNECT パケットに Will User-Property が含まれる場合の接続クラッシュを修正。
#18686 認可、認証、コネクター、ブリッジ、ルールエンジン、トレースリクエストの監査ログに対象ネームスペースを記録。以前はネームスペース間で区別できませんでした。クエリパラメータも記録されます。
#18754 ヘルプのみを表示する CLI コマンドで監査ログを作成しないようにしました。
例:
emqx ctl api_keysはサブコマンドなしで使用すると使用法を表示しますが、以前は空引数で操作が行われたように監査ログが記録されていました。実際に操作を行うコマンドは監査されます。#18853 SSO MFA 設定・検証認証情報が監査ログにマスクされずに保存される問題を修正。
SSO MFA リクエストボディは
usernameとbackendのみ監査記録に残し、一時トークン、TOTP コード、未知の認証情報フィールドは監査ファイル・監査 DB に書き込む前にマスクされます。#18961
emqx ctl plugins ...コマンドの監査ログで全引数が******でマスクされるリグレッションを修正。plugins引数は機密情報でないためそのまま記録します。plugins install --clusterオプションは CLI リファクタリングで誤って削除されていたため復活しました。
管理
#18600 Durable セッション有効時のクライアントリスト API フィルタリングを修正。
GET /api/v5/clientsは切断済み durable セッションをすべて結果に追加しており、conn_state,username,clientidなどのクエリフィルターを無視していました。例:conn_state=connectedでも切断済み durable セッションを返していました。現在は切断済み durable セッションにもフィルターが適用されます。フィルター適用時に切断済み durable セッションが存在するとき、レスポンスは誤った数を返す代わりに
meta.countフィールドを省略します。conn_state=connectedフィルター時は正確なmeta.countを返します。#18666
GET /api/v5/topicsは durable 共有サブスクリプションの完全な共有トピック(例:$share/group/a/1)を返すようになりました。以前はトピックのみ(例:
a/1)を返しており、通常の durable サブスクリプションと区別できませんでした。#18817 リクエストボディに
enableフィールドがない場合、PUT /api/v5/telemetry/statusが Erlang スタックトレース付きで500 INTERNAL_ERRORを返す問題を修正。現在は検証メッセージ付きで
400 BAD_REQUESTを返します。API ドキュメントはenableを必須とし、デフォルト値を表示しません。エンドポイントは以前からデフォルトを適用していません。#18859 設定更新時に HTTP ヘッダー名の大文字小文字だけを変更すると保存済み値が消える問題を修正。
#18860 クライアントメッセージページネーションで最終ページに継続位置を返す問題を修正。
GET /clients/{clientid}/mqueue_messagesとGET /clients/{clientid}/inflight_messagesは、メッセージがなくなるとmeta.positionにend_of_dataを返し、API クライアントは追加の空ページをリクエストせずに停止できます。
デプロイメントとセキュリティ
#18836 クラスター設定同期のデバッグログに成功した設定変更結果を含めるのをやめました。
結果には HTTP 認証ヘッダーのテンプレートなどのコンパイル済みランタイム状態が含まれ、ログのマスク対象外の秘密情報を含んでいました。
6.3.0
リリース日: 2026-09-03
EMQX 6.3.0 へのアップグレード前に破壊的変更と既知の問題を必ずご確認ください。
改善点
Core MQTT 機能
#16694 QUIC 接続からピア証明書を抽出する機能を追加し、QUIC mTLS リスナーで
peer_cert_as_usernameを有効にできるようにしました。#17307 リスナーの SUBSCRIBE パケットに対するクライアント単位レートリミッターを追加。デフォルトは無効。有限レート設定時、制限超過パケットは Quota Exceeded 理由コード付き SUBACK で応答し処理しません。ネームスペースごとに独立したレートを設定でき、リスナーレベルのレートを上書きします。
#17546 #18477 MQTT 5.0 クライアントが
Session-Expiry-Intervalプロパティで要求できるセッション有効期限の上限を設定するmqtt.max_session_expiry_intervalを追加。クライアントが上限を超える値を要求した場合、サーバーは黙って制限値に丸めて CONNACK に反映します。デフォルトはinfinity(制限なし)で従来動作を維持。MQTT 3.1.1/3.1 クライアントには影響ありません。この制限は DISCONNECT パケットのセッション有効期限にも適用され、クライアントが切断時に期限を延長できなくなります。
#17603 TLS クライアント証明書の Subject Alternative Name を MQTT クライアント属性に抽出する機能を追加。
mqtt.client_attrs_initでcert_san.dns、cert_san.ip、cert_san.email、cert_san.uriを使用可能。#17854 MQTT TCP リスナーのデフォルト
tcp_backendをsocketに変更し、メッセージレイテンシとリソース使用を改善。tcp_backend = gen_tcpで従来のバックエンドも利用可能。#17870 遅いまたは混雑したサブスクライバー向けのインメモリセッション配信動作を改善。
- EMQX は接続送信キューの混雑を追跡し、必要に応じて QoS 0 配信をセッションメッセージキュー経由に切り替えます。
- セッションメッセージキューは容量到達時に古い QoS 0 メッセージを優先的に削除し、QoS 1/2 配信の進行を助けます。
- 配信レート制限到達時の配信順序を修正し、後続メッセージが先行キューイングメッセージを追い越さないようにしました。
- ソケットバック接続の
send_timeout処理を改善し、ソケットキューがウォーターマークを超えた後にのみタイムアウトを設定します。
アクセス制御
#17145 認可ソースが Variform ベースの前提条件をサポート。前提条件が
trueの場合にのみ認可ソースが呼び出され、クライアント属性、アクション、トピックなどのコンテキストに応じて異なる認可バックエンドを選択可能。#17487 Dashboard 管理者パスワードと API キー秘密のハッシュ強化。
Dashboard 管理者パスワードは PBKDF2-HMAC-SHA256(60万回反復)と16バイトランダムソルトでハッシュ。API キー秘密は同じ自己記述形式で16バイトランダムソルトを使い反復なし。従来の単一 SHA-256 + 2バイトソルト方式は両者で置き換え。
既存ハッシュは認証に使用可能。ユーザーがパスワードを変更するか API キーを再作成すると新形式に書き換え。
#17671 認証・認可拒否ログにバックエンド識別情報を追加。
認証拒否時は拒否を出した認証器 ID とプロバイダーを警告ログで出力。認可拒否時は認可ソース種別、モジュール、トピック、アクションを警告ログで出力(従来はクライアントトレースでのみ可視)。
複数認証器や認可ソースがある環境で、クライアントトレースなしにどのバックエンドが決定を出したか判別可能。新ログは認証器・認可ソースごとにスロットリング。
#18130 HTTP 認証器・認可器の URL ホストにテンプレート変数をサポート。例:
https://${client_attrs.tns}.auth.example.com/authn。外部ルーティング層なしでテナント別認証・認可エンドポイントを実現。hostname_resolution設定でホストの扱いを制御。デフォルトstaticは従来動作で、設定時に固定ホスト名を解決し接続プールを作成。dynamic(テンプレートホスト時必須)は毎リクエストでホスト名を解決し、リクエストごとに接続を作成。TLS オプションを適用。pool_sizeはアイドル接続数上限。パイプラインは無効。テンプレートホストの場合、
allowed_hosts設定に許可ホスト名リスト(完全一致または*.suffixワイルドカード)を指定。レンダリング結果がリスト外ならリクエストを送らずチェック失敗。リテラルホストは従来通り接続プールを利用。#18239 #18371 フラッピング検出がクライアント ID に加え、ユーザー名と接続元 IP アドレスにも対応。
各次元は独自の検出ウィンドウ、接続試行閾値、禁止期間を持ち、
flapping_detect.by_clientid、by_username、by_peerhostで設定(ユーザー名・IP 検出はデフォルト無効)。クライアント ID 次元は従来の平坦なflapping_detect設定と互換性あり。検出閾値超過時は接続試行を拒否し、既接続クライアントは影響なし。禁止エントリは/bannedREST API で確認・削除可能。エントリはタイプ(clientid、username、peerhost)と検出元を持ち、タイプでフィルター可能。ゾーン・次元ごとにカウンターを分離し、異なる検出ウィンドウのゾーン間でカウンターが破棄されません。
新メトリクス:
flapping.detected.clientid、flapping.detected.username、flapping.detected.peerhost(次元別フラッピングトリガー数)、client.banned(禁止エントリによる接続拒否数)。
マルチテナンシー
- #17454
/api/v5/prometheus/data_integrationの Prometheus データをリクエスト元のアクターのネームスペースに限定。グローバル管理者は全ネームスペースのデータを閲覧・フィルタ可能。
データ統合
#17129 GCP ベースコネクター(GCP PubSub Producer、Consumer、BigQuery)にアタッチドサービスアカウント認証を追加。GCP VM にサービスアカウントがアタッチされている場合、内部メタデータエンドポイントからトークンを取得可能。
#17222 Bigtable へのデータ追加をサポートするデータ統合を追加。
#17547 Kafka Producer/Consumer コネクターに AWS IAM Roles Anywhere を追加。認証ヘルパープロセスの HTTP エンドポイントを設定可能。
認証ヘルパープロセスは EMQX からアクセス可能で稼働している必要があります。詳細は AWS IAM Roles Anywhere credential helper documentation を参照。
#17783 PostgreSQL 系コネクターに
application_nameオプションを追加。デフォルトはemqx。PostgreSQL のアクティビティビューやログでコネクターセッションを識別可能。#18119 Disk Log コネクターに時間ベースのファイルローテーションを追加。
新しいオプション
rotationを追加:rotation.period:none(デフォルト)、day、hour。dayまたはhour設定時は期間境界で別ログセットを開始し、ファイル名に期間の日付スタンプを付与(例:mqtt-trace-2026062400.log.1)。サイズベースローテーションは期間内で適用。rotation.retention_period: 過去期間のファイル保持期間(例:30d)。期間外ファイルは期間ローテーションごとに自動削除。デフォルトはinfinity。rotation.timezone: 期間境界のタイムゾーン。UTC(デフォルト)、local、+02:00などの固定オフセット。
デフォルト動作(
rotation未設定またはnone)は変更なし。#18319 BigQuery アクションにアクション固有のプロジェクト ID 指定を追加。
#18624
emqx ctl actions showとemqx ctl actions statusコマンドを追加。ローカルノードのアクションステータスを JSON で表示。REST API 認証やネットワーク呼び出し不要。statusは{"<type>:<name>": "<status>"}の JSON 配列をコンパクトに表示。showはGET /api/v5/actions/{id}と同様の情報を表示(コネクター秘密はマスク)。両コマンドは--name <type:name>でアクション選択、--ns <namespace>でネームスペース選択可能。デフォルトはグローバルネームスペースの全アクション。ローカルノードの準備状況確認に適します。クラスタ集約された REST API の
statusフィールドはローカルノードの準備状況を示しません。
オブザーバビリティ
#17493 セッションバッファのオブザーバビリティを追加。クライアント API は
total_payload_bytesを報告し、sysmon.session.total_payload_bytes_high_watermarkはペイロードバイト閾値超過セッションで警告を抑制付きで発行。emqx ctl session-topはクラスタートップセッションをtotal_payload_bytesまたはmqueue_lengthでエクスポート可能。#17582 Prometheus メトリック収集を
prometheus.erl6.1.2 に更新し、パフォーマンスとスケーラビリティを改善。vm_dist、vm_statistics、vm_system_info、vm_memoryコレクターはデフォルトで有効。廃止されたemqx_vm_process_messages_in_queuesメトリックは Prometheus 出力から削除。#17607 #17998 名前付きコレクション、ワイルドカードトピックフィルター、ネームスペース所有権、REST CRUD、Prometheus スクレイプエンドポイントを備えた v2 トピックメトリクスを追加。
/api/v5/mqtt/topic_metrics2/:nameでユーザー指定名のトピックメトリクスコレクションを登録可能。ワイルドカード(例:t/#,sensor/+/temp)をトピックフィルターに使用可能。1つのパブリッシュメッセージが複数コレクションにマッチ可能。- コレクションはネームスペーススコープ。ネームスペース管理者が作成したコレクションは
client_attrs.tnsが一致するパブリッシャーのみカウント。グローバル管理者が作成したコレクションは全パブリッシャーをカウント。ネームスペース管理者は自分のコレクションのみ閲覧・変更可能。グローバル管理者はnsクエリパラメータで個別コレクションにアクセス可能。名前空間外のns指定は403 Forbidden。ns省略時はアクター自身のネームスペース。 - カウンターは
/api/v5/prometheus/topic_metricsで Prometheus 形式で公開。ラベルはname、topic_filter、namespace。レートは Prometheus のrate()で計算可能。 - v1 API(
/api/v5/mqtt/topic_metricsと/api/v5/mqtt/topic_metrics/:topic)は変更なく動作継続。Swagger 仕様で非推奨とされ、統合は v2 を推奨。
#18148 OpenTelemetry 経由の Dynatrace 統合を追加。対応信号はトレースとログ。OAuth2 トークンで認証。
デプロイメントとセキュリティ
#17381 OpenAPI 仕様エンドポイントをデフォルトで認証必須に。対象は
GET /api-docs/swagger.json、GET /api-spec.json、GET /api-spec.md、GET /api-spec/:tag[/:name]。未認証リクエストは 401 を返し、
WWW-Authenticateヘッダーと最小限の有効な OpenAPI ドキュメント(または Markdown)を返します。ドキュメントにはサポートされるセキュリティスキームと公開ブートストラップエンドポイント(POST /api/v5/login、GET /api/v5/status)が含まれ、Dashboard の匿名アクセスでの API 表示を制限しつつ認証方法を案内します。Dashboard の
api-spec.htmlエクスプローラーは匿名で読み込み、既存のセッション Cookie またはトークンで仕様を取得します。#17407 #17808 Feature Gates を追加。
EMQX_FEATURES環境変数で起動時に利用する機能セットを制限可能。無効なプリセットや機能名はノード起動を阻止。依存機能は自動有効化。プリセット:
FULL: デフォルト。全機能を有効化。ESSENTIAL: 最小機能セット。コア MQTT ブローカーと認証・認可のみ。
カスタムリストで選択可能な機能:
dashboard: Dashboard UI(SSO、RBAC含む)、REST APIdata_integration: コネクター、アクション、ソース、ルールエンジンmessage_transformation: メッセージ変換schema_validation: スキーマ検証schema_registry: スキーマレジストリgateways: ゲートウェイプロトコルcluster_link: クラスターリンクmulti_tenancy: マルチテナンシーとネームスペースai: AI 機能(A2A レジストリ、AI 補完)metrics: Prometheus メトリックエクスポートmqtt_extensions: MQTT 拡張(遅延パブリッシュ、トピック書き換え、自動サブスクライブ、遅延サブスクリプション、メッセージキュー、ストリーム)plugins: サードパーティプラグイン管理フレームワークfile_transfer: MQTT ファイル転送拡張exhook: 外部 gRPC フックopentelemetry: OpenTelemetry エクスポーター
自動有効化される依存関係:
機能 自動有効化される依存機能 data_integrationschema_registrymessage_transformationschema_registryschema_validationschema_registryaischema_registrymetricsdashboardopentelemetrydashboard他の機能に依存関係はありません。
#17768
file://URL 形式でnode.cookieをファイルから読み込む機能を追加。オペレーターは
node.cookie = "file:///path/to/cookie"(または環境変数EMQX_NODE__COOKIEにfile://URL)を設定可能。クラスター秘密を設定ファイルに平文で保存せずに済みます。参照先は通常ファイルまたは FIFO(名前付きパイプ)で、ノード起動時に一度読み込みます。FIFO 使用時は起動時にオーケストレーターが書き込む必要があります。emqx ctlなどのコマンドは既存ノードからクッキーを取得するため、ファイルを再読み込みしません。解決されたクッキーは Erlang VM に直接渡され、
data/configs/vm.*.argsに書き込まれなくなり、起動時のディスクへの秘密保存を防止します。#17803
EMQX_FEATURES=ESSENTIALで起動した場合、Erlang コード読み込みモードをデフォルトでinteractiveに変更。無効化された機能の.beamファイルは起動時に全て読み込まれず、必要時にオンデマンドで読み込まれます。これにより、ESSENTIAL モードのノードの常駐メモリフットプリントが大幅に削減されます。CODE_LOADING_MODEで上書き可能。#18451 起動時環境変数を
etc/emqx.env(RPM/DEB は/etc/emqx/emqx.env、Docker は/opt/emqx/etc/emqx.env)から読み込む機能を追加。ファイルには
EMQX_FEATURESとEMQX_SECURITY_PROFILEのデフォルトコメントと説明が含まれます。emqx.conf解析前に読み込まれるため、emqx.conf内で設定できません。emqxコマンドは毎回このファイルをソースし、サービス起動、フォアグラウンド起動、emqx ctlで同じ値を使用します。パッケージアップグレードで編集内容は維持されます。#18452
GET /nodesとGET /nodes/{node}のノード情報にsecurity_profileとfeature_presetを追加。security_profileはlegacyまたはhardened。feature_presetはfull、essential、custom。ノード起動時に固定され、クラスター内で異なる設定のノードがある場合に一覧で確認可能。停止ノードはこれらのフィールドを返しません。#18453
security_profile_divergenceアラームを追加。hardenedセキュリティプロファイルのノードはクラスター内の他ノードのプロファイルを定期チェックし、legacyプロファイルのノードがある場合にアラームを発報。legacyノードはチェックしません。古い EMQX リリースはlegacyとみなします。アラームメッセージにlegacyノード名を含み、アラーム詳細はアラーム中のノードリストを保持。すべてのノードがhardenedになるか最後のlegacyノードが離脱するとアラームは自動解除。ローリングアップグレード中は一時的に発生する想定。長期間アクティブな場合は新設定で再起動されていないノードが存在します。
#18471
node_dump診断スクリプトに起動時環境ファイルetc/emqx.envのEMQX_FEATURESとEMQX_SECURITY_PROFILE設定を追加(ファイルが存在する場合)。他の変数は収集しません。#18557 #18609
node.default_listener_address設定を追加。MQTT リスナー、ゲートウェイリスナー、Dashboard HTTP リスナーのbindに明示的なアドレスがない場合のバインドアドレスを指定可能。値はloopback(127.0.0.1)、nodename(Erlang ノード名のホスト部のアドレス)、all(0.0.0.0)、IPv4/IPv6 リテラルアドレス、または起動時に解決するホスト名。未設定時はセキュリティプロファイルが従来通り決定。明示的なIP:portバインドが優先。公式 Docker イメージは
EMQX_NODE__DEFAULT_LISTENER_ADDRESS=allを設定し、セキュリティプロファイルに関係なくデフォルトリスナーがコンテナ公開ポート経由で到達可能。リスナービューは
resolved_addressを追加し、ノード上で実際にバインドされた IP アドレスを表示。bindは設定値(ポート含む)を表示し続け、resolved_addressはセキュリティプロファイルやnode.default_listener_address適用後の IP アドレス(ポート除く)を表示。resolved_address_fromは値の由来を示す。両フィールドはノードローカル。
GET /api/v5/listeners/:idはリクエスト処理ノードの値を返し、GET /api/v5/listenersはノードごとにnode_status配下で返す。同一クラスター内でノードごとに異なる値になる場合があります(例:node.default_listener_address=nodename)。emqx ctl listenersは既存のlisten_onと並べて両フィールドを表示。#18628 データバックアップのエクスポートにエクスポート元ノードのセキュリティプロファイルを記録。
legacyプロファイルでエクスポートされたバックアップをhardenedプロファイルのノードに復元すると、以下の動作差異が発生する可能性があります:- MQTT、ゲートウェイ、Dashboard HTTP リスナーの裸ポートバインドが全インターフェースからループバックに変わる
- 空または無効化された認証チェーンが全クライアント拒否に変わる
- 復元された Dashboard アカウントはデフォルトパスワードでログイン不可になる
- 以前は無視されていた認証・認可バックエンド失敗が操作拒否になる
このようなバックアップの復元には CLI フラグ
--allow-security-profile-mismatchまたは API パラメータallow_security_profile_mismatchが必要で、オペレーターが差異を確認可能に。変更前のバックアップはlegacyと同等に扱われます。legacyノードへの復元は影響なし。
プラグイン
#18455
hardenedセキュリティプロファイル下でemqx ctl plugins allow <Name-Vsn>はsha256:<hex>引数を必須化。プラグインパッケージを指定された SHA-256 ダイジェストに紐付け、バイトが一致しないアップロードは拒否。引数なしは拒否し、必要なコマンドを表示。クラスターピアから送られたダイジェストなしの許可も拒否。legacyプロファイルは変更なしで引数は任意。
パッケージング
- #17335 RPM/DEB インストール後に
/opt/emqxディレクトリを作成し、パッケージで使用される散在する FHS パスを指す便利なシンボリックリンク(bin、data、etc、lib、log、plugins、releases、erts-*)を配置。オペレーターは公式 Docker イメージと同じ/opt/emqx/...パスを使用可能。
パフォーマンス
#17583 JSON エンコード・デコードのパフォーマンスを改善。
Erlang/OTP 標準に準拠した浮動小数点数のフォーマットに変更され、以前と若干異なる場合があります(例: 科学記数法の使用開始が早くなる)。
#18033 ESSENTIAL 機能モード(および Dashboard/管理クライアントの client-info API 無効時)で、
GET /clientsエンドポイントのみに利用される接続ごとの統計報告を停止し、高接続数時のオーバーヘッドを削減。#18424 プラグイン設定スキーマ(
config_schema.avsc)をプラグイン設定検証時に毎回インストール済みプラグインパッケージから読み込み、メモリに保持しなくなりました。インストール済みプラグインのスキーマファイルが欠落または読み込み不可の場合は設定検証でファイルエラーを報告。
#18688 ダーティ I/O スケジューラースレッド数(
+SDio)をnode.dirty_io_schedulersで設定可能に。デフォルトautoはnode.schedulersが2以上のノードで従来の8、2以下の小規模ノード(例: 2 vCPU コンテナ)で4を使用。小規模ノードの起動時メモリフットプリントを削減しつつ、ブロッキング I/O オーバーラップに十分なスレッド数を確保。
バグ修正
Core MQTT 機能
#18010 クライアントから送信された不正な MQTT パケットをブローカーエラーとしてログに記録しなくなりました。
不正入力はリスナーの接続シャットダウンカウンターにカウントされ、ポートスキャンやプロトコルファザー、誤動作クライアントのアラートノイズを削減。パケット固有の詳細を持つ解析エラーは単一の
frame_errorカウンターを共有し、新規カウンター名を生成しません。解析エラーの詳細(問題のバイト列など)はトレースで報告されます。クライアント ID、IP アドレス、トピックでトレースを開始して確認可能。
#18027 共有サブスクリプションが無効な場合、共有サブスクライブを試みるクライアントを切断するように共有サブスクリプション処理を変更。
mqtt.shared_subscription = falseでクライアントが$share/...または$queue/...を含む SUBSCRIBE を送信すると、MQTT 仕様に従い接続を閉じます。MQTT 5.0 クライアントには理由コード0x9E(Shared Subscriptions not supported)付き DISCONNECT パケットを送信。MQTT 3.1/3.1.1 クライアントは単に接続を閉じます。以前は失敗理由コード付き SUBACK を返し接続は維持されていました。
#18116
strict_mode有効時(デフォルト)、MQTT v5 パケットで非繰り返しプロパティが複数回含まれる場合(例: CONNECT パケットにSession-Expiry-Intervalが2つ以上)はプロトコルエラーとして拒否。最後の値を黙って使う動作から変更。繰り返し許可のUser-Propertyは影響なし。従来の寛容な動作はリスナー設定で
strict_mode = falseにより復元可能。#18438 送信パケットサイズチェックのオフバイワンを修正。
クライアントの
Maximum Packet Sizeと同じサイズのパケットは破棄されframe_is_too_largeとログに記録されていました。MQTT 5.0 仕様では制限超過パケットのみ破棄すべきであり、同サイズは送信されます。制限未満のパケットは影響なし。#18470 元のパケットがパブリッシャー切断前に受信されていなかった場合に、再送された QoS 2 PUBLISH パケットをアックするが配信しない問題を修正。
#16721 で導入された QoS 2 重複処理の変更を部分的に元に戻しました。PUBREL 待ち状態が期限切れ後、再送された QoS 2 PUBLISH は新規 QoS 2 交換として扱われ、購読者に複数回配信される可能性があります。EMQX 7.0.0 以降は PUBREL 待ち状態期限切れをデフォルトで無効にし、再配信を防止予定。
#18487 不明なパケット識別子を持つ PUBACK、PUBREC、PUBREL、PUBCOMP パケットのログ量を削減。これらはデバッグレベルでログされ、クライアントトレースで確認可能。
#18523 ノードシャットダウン時の停止順序を修正し、アプリケーション停止前に MQTT リスナーを停止。
以前はリスナーがクライアントトラフィックを受け付け続け、パブリッシュパスのアプリケーションが停止済みであったため、ルールエンジンなどで
hook_callback_exceptionエラーが多発。リスナーを先に停止することでアプリケーション停止中にトラフィック処理を防止。ノードはシャットダウン開始時点で
GET /statusで非稼働と報告し、ロードバランサーが新規接続を停止。#18585 MQTT 仕様に従い、同一クライアント ID で新接続がセッションを引き継がない場合は古いセッションを終了するように修正。
MQTT 5.0 クライアントの Session Expiry Interval 0、MQTT 3.1.1 クライアントの Clean Session 1 が対象。以前は新接続が古いセッションのサブスクリプションやキューイングメッセージを引き継ぎ、Will Delay Interval > 0 の遺言メッセージが黙って破棄されていました。現在は新接続が新規セッション(CONNACK Session Present 0)を開始し、古い接続は理由コード 0x8E(Session taken over)付き DISCONNECT を受け、遺言メッセージがあればテイクオーバー時にパブリッシュされます。
アクセス制御
#18246 ハードニングセキュリティプロファイルで遅延メッセージ認可を追加。
- 遅延メッセージは再生時に再認可されます。MQTT とゲートウェイクライアントの遅延メッセージは制限付き認可コンテキストを持ち、現在のパブリッシュ認可ルールと禁止レコードをチェック。スケジュール時に認可済みでも再生時に破棄される場合があります。
- ハードニングプロファイルでは、アップグレード前に作成された認可コンテキストを持たない保留遅延メッセージは再生時に破棄されます。レガシープロファイルは再生します。
- 複数ゲートウェイでのマウントポイント処理を修正。ゲートウェイは論理トピック(マウント解除済み)を認可に渡します。
authorization.include_mountpoint = falseなら論理トピックをチェック。trueなら認可チェック前にマウントポイントを1回適用。パブリッシュ・サブスクライブ時は常にマウントポイントを1回適用。 - GBT 32960、JT/T 808、LwM2M、NATS、STOMP ゲートウェイはマウント済みトピックをパブリッシュ認可に渡さなくなりました。重複マウントによる認可チェックを防止。
- GBT 32960 の
dnstream、JT/T 808 のproto.dn_topic、LwM2M のコマンド自動サブスクライブは認可前にマウントポイントを適用しません。 - JT/T 808 の
proto.up_topicとproto.dn_topicはゲートウェイマウントポイント相対に変更。デフォルトはjt808/${clientid}/${phone}/upとjt808/${clientid}/${phone}/dnから${phone}/upと${phone}/dnに変更。 - MQTT-SN のアイドル QoS -1 パブリッシュと遺言メッセージは設定されたマウントポイントを適用。以前は適用されていませんでした。
- NATS パブリッシュ認可は NATS サブジェクトから変換した MQTT トピックに対してマウントポイント適用前にチェック。NATS JWT 権限と EMQX 認可はマウント済みトピックをチェックしません。
- 遅延メッセージの重複処理を修正。ブリッジ、リテイナー、スキーマバリデーターなど他システムは遅延メッセージを再生時のみ処理。プラグインなどの直接内部パブリッシャーは遅延メッセージスケジューリングに
message.ingressフックを呼び出す必要があります。emqx:publish/1直接呼び出しや管理 API の$delayed/...パブリッシュはメッセージイングレスをバイパスし、遅延メッセージをスケジューリングしません。
#18458
oidccを 3.2.3 にアップグレード。プロバイダー設定ワーカーがキャッシュ更新中に忙しい場合の Dashboard SSO(OIDC)ログインタイムアウト(
INTERNAL_ERROR: exit,{timeout,{gen_server,call,[...]}})を修正。#18576 OIDC SSO 設定 API (
GET /api/v5/sso/oidc) はクライアント JWKS 未設定時にclient_jwksをnoneで返すように修正。CLI 出力と一致。以前は未設定でもマスクされた******を返していました。設定済み JWKS はマスクのまま。#18580
bin/node_dumpスクリプトが生成するconf.hoconファイルで機密設定値をマスク。設定スキーマで機密指定された
dashboard.default_passwordやlicense.keyなどの値は******として書き込み。修正前は固定のキー名リストのみマスクされ、これらは平文で書き込まれていました。
マルチテナンシー
#18423 ネームスペース管理者によるデータバックアップインポートは自身のネームスペース設定のみ適用。認証、認可、ExHook、リスナーなどのクラスタ全体設定は警告付きでスキップされ、グローバル設定に書き込まれません。
#18466 特殊文字を含むネームスペース名のバックアップファイル一覧表示を修正。
以前は
*、?、{}、[]などを含むネームスペースでバックアップファイルが存在しても一覧が空でした。ネームスペース名をリテラルディレクトリ名として扱います。#18539 ネームスペースが変わって再接続した永続セッションをマルチテナンシークライアント一覧が追従しない問題を修正。
以前は
clean_start=falseで既存セッションを再開した際、古いネームスペースにクライアントが残り、新しいネームスペースの一覧に含まれませんでした。クライアント一覧とネームスペースごとのクライアント数は常に接続時のネームスペースを反映し、永続セッション再開後にクライアントが消える問題も修正。
ゲートウェイ
#17796 UDP ソースポートが最近切断されたデバイスで使われていた場合に MQTT-SN ゲートウェイがクラッシュする問題を修正。古いチャネルを正常に退避し、新規接続を新規セッションとして処理。
#17805 不正な設定やポート競合でロードが途中中断された後、ゲートウェイの再ロードが
already_startedエラーで失敗する問題を修正。失敗時のロックプロセスを自動回収し、次回ロードやオペレーター再試行時にクリーンな状態から開始。#17815 UDP ソースタプルが変わるか再利用される場合の MQTT-SN UDP セッションルーティングを修正。
MQTT-SN UDP リスナーはパケットから解析した ClientId で
esockd_udp_proxyを通じてルーティングし、スリープ中セッションが異なる UDP ソースタプルから再開可能にし、再利用された UDP ソースタプルが別 ClientId のパケットを古いセッションに届けるのを防止。#17888 LwM2M ゲートウェイが MQTT 登録・更新レポートに
password、secret、private_key、access_tokenなどの機密クエリフィールドを含める問題を修正。#18051 CoAP デバッグログの URI クエリ値漏洩を修正。
プラグイン
#17861 ノード起動や再参加時にクラスタープラグイン設定に存在しないローカルプラグインパッケージを削除しないことで、以前のプラグイン起動動作を復元。
#17884 クラスタープラグイン設定に存在せずローカルで実行もされていない古いプラグインパッケージをプラグイン管理 HTTP API が無視するよう修正。
これらの古いパッケージはプラグイン一覧、詳細、設定、スキーマレスポンスに表示されず、操作 API で操作できず、HTTP インストール API での再インストールを妨げません。設定済みのプリインストールプラグインは表示され続け、ドキュメント通りのプリインストールワークフローに従います。
プラグインパッケージがアンパックされているが
plugins.statesで有効・無効いずれでもない場合、起動時と HTTP API アクセス時にエラーをログ出力。#17932 CLI でプラグインインストール時の
failed_to_get_plugin_config_from_cluster警告ログを抑制。emqx ctl plugins installは HTTP API と同様にfresh_installモードでインストールし、クラスタ設定検索をスキップ。これによりクラスタ内全ノードでの繰り返し警告を回避。--clusterフラグを追加し、指定時は稼働中全ノードに一括配布・インストール。#18018 プラグインパッケージインストール時にパッケージのアプリケーション宣言、設定スキーマ、デフォルト設定の検証前にコードをロードしていた問題を修正。
#18153 ルート JSON 値の型が不正な場合にプラグイン設定 API が
500 INTERNAL_ERRORではなく読みやすい検証エラーを返すよう修正。
オブザーバビリティ
#17886 パブリッシュクォータ超過パケットメトリックを Prometheus で
emqx_packets_publish_quota_exceededとして公開。#18114 ノードがクラスター参加中に Dashboard メトリクス API (
GET /api/v5/monitor_current、GET /api/v5/monitor) が500 INTERNAL_ERRORを返す問題を修正。参加中ノードのアプリケーション再起動中にメトリクスサンプリングが失敗しても、残りの到達可能ノードの集計を返し、警告ログを出力してリクエスト全体の失敗を防止。
また、
DELETE /api/v5/monitorの成功時に毎回出ていた不要なclear_monitor_metrics_rpc_errors警告を修正。
ファイル転送
- #18069 ファイル転送ファイル一覧 API (
GET /api/v5/file_transfer/files) が非 ASCII 文字(例: 中国語)を含むファイル名で 500 エラーになる問題を修正。
デプロイメント
- #17877
emqx-enterpriseHelm チャートのノードホスト名にsvc.cluster.localをハードコードしていた問題を修正。DNS ドメインがcluster.localでない Kubernetes クラスターで名前解決できず Erlang 分散が開始できずクラスター形成に失敗していました。ホスト名はチャートのclusterDomain値に従います。
6.2.3
リリース日: 2026-08-21
EMQX 6.2.3 へのアップグレード前に破壊的変更と既知の問題を必ずご確認ください。
改善点
アクセス制御
#17813 Dashboard ユーザーと API キーのエンドポイントで、管理者相当の権限を持つスコープ(
system、user_management、api_key_management、sso_management)とその他のスコープが混在するスコープリストを拒否する検証を追加。これら4つの特権スコープは管理者相当の権限を持つため、制限付きスコープと組み合わせても意味のある制限になりません。管理者相当のスコープのみ、またはそれ以外のみを使用してください。既存の混在スコープを持つレコードは更新まで動作継続。更新時は分割が必要。
#17980 ハードニングセキュリティプロファイルで、サーバー起動のサブスクライブに対してトピック検証、認可、MQTT 機能チェック、クライアントサブスクライブフックを適用。
#18002 ハードニングセキュリティプロファイルで SAML レスポンスとアサーションの署名検証をデフォルトで有効化。
#18296
is_jwt(value)関数を認証器のprecondition式(および Variform 式全般)に追加。値が構造的に JWT(JWS コンパクト形式)である場合にのみ真を返し、署名は検証しません。JWT でないパスワードを提示するクライアントを JWT 認証器からスキップ可能。特にハードニングプロファイルで非 JWT 資格情報が JWT 認証器で拒否される問題を回避。
マルチテナンシー
#17732 API キー作成・更新エンドポイントに
namespaceフィールドを追加。オペレーターはrole文字列にネームスペースを埋め込む必要がなくなりました(既存のns:<namespace>::<role>形式は引き続き有効)。両方指定した場合は一致が必要。#17855 ネームスペーススコープ付き Dashboard 管理者は自身のネームスペース内の API キーを作成、一覧、参照、更新、削除可能に。グローバル API キーや他ネームスペースのキーは作成不可で、他ネームスペースのキーは非表示。
データ統合
#17933 RabbitMQ コネクターで複数ノードの
serversリスト(例:rmq1:5672,rmq2:5672)をサポート。接続時フェイルオーバーとプール開始オフセットのローテーションを提供。servers未設定時は従来のserver/portを使用。#17944 HTTP コネクターと HTTP 認証・認可に OAuth2 クライアントクレデンシャル認証を追加。設定時、EMQX はトークンエンドポイントからアクセストークンを取得・更新し、アウトバウンドリクエストに Bearer 認証ヘッダーとして追加。
コネクターのヘルスチェックはトークン取得不能時に
disconnectedを報告。OAuth2 有効かつAuthorizationヘッダー指定は拒否。EMQX はトークンリクエストボディにクライアント ID とシークレットをフォームフィールドで送信。HTTP Basic
Authorizationヘッダーでの送信は非対応。#18014 Datalayers Arrow Flight コネクターで準備済みステートメントの自動再構築を追加。サーバーが準備済みステートメントを失った場合(例: 再起動後)、クライアントが自動で再作成し書き込み操作を再試行、書き込み失敗を回避。
#18042 DynamoDB コネクターに AWS IAM ロール認証を追加。
アクセスキー ID とシークレットアクセスキーが両方省略された場合、EMQX は ECS タスクロールまたは EC2 インスタンスメタデータから一時認証情報を取得し、有効期限前に更新。
#18081 Snowflake Streaming アクションのレジリエンスを改善。チャネル内部状態が同期外れになる特定のエラー時に失敗した行をリトライし、手動介入なしにチャネル再オープンを試行。
#18085 Kafka、Confluent、Azure Event Hubs プロデューサーに以下の設定を追加。
max_batch_age(アクション): プロデューサーバッファ内でこの期間を超えたメッセージを破棄し、dropped.expiredメトリックを増加。デフォルトはinfinity(破棄なし)。max_retries(アクション): 失敗リトライ回数上限。上限超過でバッチを破棄し、failedメトリックを増加。リトライカウンターは Kafka のエラーコード応答時のみ増加し、接続喪失後の再送はカウントしない。デフォルトはinfinity(無限リトライ)。reconnect_delay(アクション): 接続喪失後の再接続遅延。デフォルトは2s(従来は固定)。request_timeout(コネクター): Kafka 応答待ち時間。デフォルトは30s。
Kafka クライアントライブラリ(wolff)を 4.2.1 にアップグレードし、メモリモードバッファの
max_linger_timeサポートを復活。小規模バッチは最大max_linger_time待機してメッセージを集約し、送信リクエスト頻度を削減。満杯バッチは遅延なしで送信。#18110 スキーマレジストリで JSON Schema draft 2019-09 と 2020-12 をサポート。
#18137 GCP Pub/Sub プロデューサー・コンシューマーが完全修飾トピックパス(
projects/<project-id>/topics/<topic-name>)を受け入れ可能に。サービスアカウントのプロジェクトとは異なる GCP プロジェクトのトピックにパブリッシュ・コンシューム可能。ベアトピック名は従来通りサービスアカウントのプロジェクトで解決。コンシューマーは購読をサービスアカウントのプロジェクトに作成し、トピック参照のみ別プロジェクトを指す。
ルールエンジン
#18253 2つの SQL 関数
map_to_range(value, min, max)とhash_to_range(value, min, max)を追加。値またはそのハッシュを指定範囲内の整数にマッピング。シャーディングやバケット分割に便利。例:hash_to_range(nth(2, tokens(topic, '/')), 0, 3)でトピックの2番目トークンからシャードインデックスを算出。#18306 LZ4 Frame 圧縮・解凍のルール関数
lz4_compressとlz4_uncompressを追加。
プラグイン
- #18012 EMQX REST API 経由の同期 MQTT リクエスト/レスポンスフローを提供する
emqx_sync_requestプラグインを追加。ノードローカル CLI 診断でリクエストカウンターと現在の保留状態を確認可能。
パッケージング
#18037 Enterprise Linux 10(Red Hat Enterprise Linux 10、Rocky Linux 10、互換ディストリビューション)用パッケージを追加。
#18127 macOS 26(Tahoe)用パッケージのリリースを開始。
バグ修正
Core MQTT 機能
#17895 管理証明書バンドルからファイルベース証明書に切り替える TLS リスナーで、参照先バンドルが既に削除されていても成功するよう修正。
#17911 Erlang/OTP
sslアプリケーションが対応している場合、DTLS リスナーでECDHE-PSK-CHACHA20-POLY1305暗号スイートを検証可能に。#18102 配信レート制限が有効な場合に MQTT クライアントが QoS 1/2 メッセージを順不同で受信する問題を修正。EMQX はブロックされたメッセージが送信可能になるまで後続メッセージをキューに保持。
#18108 参照中の管理証明書バンドルやそのファイルを削除しようとすると、参照設定を列挙した明確なエラーで失敗。
force_deleteクエリパラメータはチェックをバイパスしなくなり、API スキーマから削除。さらに、証明書バンドルがディスクに存在しないリスナーがある場合、Prometheus 統計エンドポイントが完全に失敗しなくなり、該当リスナーは証明書有効期限メトリックから除外され、警告ログを出力。
#18111
mqtt.strict_mode有効時、MQTT v3.1 CONNECT パケットでパスワードフラグがセットされユーザーフラグがセットされていない場合は拒否。MQTT v3.1.1 と同様の仕様準拠。MQTT v3.1 仕様ではユーザーなしパスワードは無効。接続ログの可読性も改善。CONNECT パケットトレースはパスワード未指定時に
Password=undefinedと表示し、空パスワードと区別。ログのpeernameフィールドは常に10.0.0.1:54123のような文字列で表示。
ルールエンジン
#17957
rule_engine.limit_selects_in_namespace = true時にグローバルネームスペースの複数ルールイベント(例:$events/client/connack)がトリガーされない問題を修正。#18049
rule_engine.limit_selects_in_namespace = true設定時にアラーム有効化/無効化トリガーのグローバルルールが発火しない問題を修正。
データ統合
#17859 MQTT コネクターが IPv6 ブローカーに接続できるよう修正。
以前は
[::1]:1883のような IPv6 リテラルが保存時にbad_host_portバリデーションエラーとなり、IPv6 のみ解決するホスト名は IPv4 で接続しようとしてホスト解決失敗していました。サーバーアドレスパーサーは括弧付き IPv6 リテラル(例:
[::1],[::1]:1883,mqtt://[::1]:1883)を受け入れ、MQTT コネクターは接続時に IPv6 プローブを有効化し、IPv6 専用ブローカーに到達可能に。MQTT コネクターとクラスターリンクの
serverアドレスは公式 MQTT URI スキームmqtt(プレーン TCP)とmqtts(TLS)を受け入れ。例:mqtt://broker:1883、mqtts://broker:8883。スキームなしのhost:portも受け入れ。その他のスキームはunsupported_schemeバリデーションエラーで拒否。#17947 HTTP コネクター更新時にアクションバッファーワーカーがブロックされ、メッセージが次のリトライまでキューに残る問題を修正。
#17955 GreptimeDB 非同期バッチが低書き込みレート時のヘルスチェック後にフラッシュされない問題を修正。
#17961 Kafka や Pulsar コネクターがヘルスチェックタイムアウトで
disconnected状態に遷移し、内部キューが再作成される問題を修正。connecting状態に遷移するように。
クラスタリング
#18826 バックアップインポート前にクラスター内全ノードが同一バージョンであることを確認。
ローリングアップグレード中のインポートは、未アップグレードノードが異なる解釈をする呼び出しで適用される可能性がありました。インポートは開始前に停止し、アップグレード待ちノードを列挙してクラスター状態を維持します。
#18862
emqx_router_tool:scan_missing_routes/1とemqx_router_tool:reconcile_missing_routes/1に渡すオプションの検証を追加。不正な
chunkやsleep_ms値はスキャンスロットリングを無効化し、オペレーターがスロットリングされていると思い込む問題がありました。ツールは不正な値や未知のオプションキー(例: 誤字のchunks)を拒否し、問題のあるオプション名を含むエラーを発生させます。#18899 ローリングアップグレード中に混在バージョンクラスターで
GET /api/v5/listenersとGET /api/v5/listeners_statusが500 INTERNAL_ERRORを返すリグレッションを修正。
Durable Storage
- #18822 ノード再起動やリーダー変更後に Durable Storage シャードが復旧できない稀な問題を修正。EMQX は追加の一時的 DS Raft リーダーエラーを再試行可能とみなし、不完全な RocksDB スキーマ初期化がシャード復旧を妨げなくなりました。
ゲートウェイ
#18755 Dashboard から既存の NATS ゲートウェイ設定を保存すると、認証資格情報がフォームに表示されるマスク値に置き換わり、NATS クライアントが認証失敗する問題を修正。
認証資格情報は、認証設定を変更せずに他のゲートウェイ設定を更新した場合に保持されます。
NATS ゲートウェイ認証設定は重複する認証方式や資格情報(重複 NKey や JWT アカウントエントリ)を拒否し、あいまいな認証動作を防止。
#18776 MQTT-SN はスリープクライアントのスリープ期間満了時に設定済みの Will メッセージをパブリッシュし、正常切断時には Will メッセージをパブリッシュしなくなりました。
#18842 ゲートウェイプロトコルはクライアント ID オーバーライドをサポートしません。認証バックエンドが返す
clientid_overrideを無視し、警告をログに出力。ゲートウェイ接続のマウントポイントテンプレートは認証結果統合後の共有ゲートウェイ認証フローで評価されます。
#18855 証明書検証済みクライアント証明書で認証された DTLS クライアントの MQTT-SN セッションウェイクアップ認可を修正。
証明書に紐づくセッションは同一のピア証明書を提示した新しい関連付けからのみ再開可能。クライアント証明書なし、異なる証明書、再発行証明書は拒否。
証明書なしの平文 UDP と DTLS クライアントは従来の ClientId のみの PINGREQ ウェイクアップ動作を維持。
プラグイン
- #18891 EMQX 6.x で Sync Request プラグインのインストール・起動が
missing_i18n_refエラーで失敗する問題を修正。プラグインは正常に起動し、API エンドポイントが利用可能に。
オブザーバビリティ
#18664 ネームスペース付きリクエストの監査ログに対象ネームスペースを記録。以前は同名の異なるネームスペースのトピックメトリクスコレクションのリセットが区別できませんでした。クエリパラメータも記録されます。
#18677 データバックアップリクエストの監査ログに対象ネームスペースを記録。以前は異なるネームスペースのバックアップ操作が区別できませんでした。クエリパラメータも記録されます。
#18678 A2A レジストリリクエストの監査ログに対象ネームスペースを記録。以前は異なるネームスペースのエージェントカード操作が区別できませんでした。クエリパラメータも記録されます。
#18684 OpenTelemetry トレース有効時に MQTT 5 クライアントの CONNECT パケットに Will User-Property が含まれる場合の接続クラッシュを修正。
#18686 認可、認証、コネクター、ブリッジ、ルールエンジン、トレースリクエストの監査ログに対象ネームスペースを記録。以前はネームスペース間で区別できませんでした。クエリパラメータも記録されます。
#18754 ヘルプのみを表示する CLI コマンドで監査ログを作成しないようにしました。
例:
emqx ctl api_keysはサブコマンドなしで使用すると使用法を表示しますが、以前は空引数で操作が行われたように監査ログが記録されていました。実際に操作を行うコマンドは監査されます。#18853 SSO MFA 設定・検証認証情報が監査ログにマスクされずに保存される問題を修正。
SSO MFA リクエストボディは
usernameとbackendのみ監査記録に残し、一時トークン、TOTP コード、未知の認証情報フィールドは監査ファイル・監査 DB に書き込む前にマスクされます。#18961
emqx ctl plugins ...コマンドの監査ログで全引数が******でマスクされるリグレッションを修正。plugins引数は機密情報でないためそのまま記録します。plugins install --clusterオプションは CLI リファクタリングで誤って削除されていたため復活しました。
管理
#18600 Durable セッション有効時のクライアントリスト API フィルタリングを修正。
GET /api/v5/clientsは切断済み durable セッションをすべて結果に追加しており、conn_state,username,clientidなどのクエリフィルターを無視していました。例:conn_state=connectedでも切断済み durable セッションを返していました。現在は切断済み durable セッションにもフィルターが適用されます。フィルター適用時に切断済み durable セッションが存在するとき、レスポンスは誤った数を返す代わりに
meta.countフィールドを省略します。conn_state=connectedフィルター時は正確なmeta.countを返します。#18666
GET /api/v5/topicsは durable 共有サブスクリプションの完全な共有トピック(例:$share/group/a/1)を返すようになりました。以前はトピックのみ(例:
a/1)を返しており、通常の durable サブスクリプションと区別できませんでした。#18817 リクエストボディに
enableフィールドがない場合、PUT /api/v5/telemetry/statusが Erlang スタックトレース付きで500 INTERNAL_ERRORを返す問題を修正。現在は検証メッセージ付きで
400 BAD_REQUESTを返します。API ドキュメントはenableを必須とし、デフォルト値を表示しません。エンドポイントは以前からデフォルトを適用していません。#18859 設定更新時に HTTP ヘッダー名の大文字小文字だけを変更すると保存済み値が消える問題を修正。
#18860 クライアントメッセージページネーションで最終ページに継続位置を返す問題を修正。
GET /clients/{clientid}/mqueue_messagesとGET /clients/{clientid}/inflight_messagesは、メッセージがなくなるとmeta.positionにend_of_dataを返し、API クライアントは追加の空ページをリクエストせずに停止できます。
デプロイメントとセキュリティ
#18836 クラスター設定同期のデバッグログに成功した設定変更結果を含めるのをやめました。
結果には HTTP 認証ヘッダーのテンプレートなどのコンパイル済みランタイム状態が含まれ、ログのマスク対象外の秘密情報を含んでいました。
(以下、6.3.0 より前のバージョンの詳細は省略します)