EMQX Enterprise Version 6
6.3.2
リリース日: 2026-10-16
強化点
コア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にアップグレードしました。クラスタテーブルへの書き込みは、呼び出しプロセスが10件から100件のキュー済みメッセージを持つ場合のみヘルパープロセスで実行されるようになり、新規サブスクリプションの高レート時のSUBSCRIBEレイテンシを低減しました。 - #19545 リテーナー有効時、ワイルドカードなしのトピックフィルターにクライアントがサブスクライブすると、リテーナーメッセージの配信準備前にリテーナーメッセージの有無をチェックし、該当メッセージがなければそれ以降のリテーナーメッセージ処理を行わずCPU使用率を削減します。
サブスクリプション検索と起動
バグ修正
コアMQTT機能
#19489 MQTT TCPリスナーのデフォルト
tcp_backendをgen_tcpに戻しました。6.3.0でUnix/Linuxのデフォルトが
socketになりましたが、接続ごとのメモリ使用量が増えるため、対応が完了するまでデフォルトをgen_tcpに戻します。メッセージトラフィックのあるテストではまだコストは測定されていません。socketバックエンドは引き続き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バックエンド接続で拒否するように。 - リスナーオプションのマージとソケットチューニングを修正し、未初期化カウンター更新時のアクセプタークラッシュを防止。
#19630
gen_tcpバックエンドのリスナーで、短時間読み込みを停止したサブスクライバーへのQoS 0配信遅延を修正しました。サブスクライバーが読み込みを再開した後も最大でmqtt.idle_timeout(デフォルト15秒)まで配信が停滞する問題がありました。TCP受信バッファが小さいクライアントは接続中ずっと送信されたQoS 0メッセージの一部しか受信できませんでした。混雑した接続はタイマーで送信キューをチェックし、サブスクライバーの読み込み再開後に速やかに配信を再開します。#19144 セッションレジストリのクリーンアップ処理が、クライアント切断時に停止する問題を修正しました。切断されたクライアントをスキップして古い登録を削除し続けます。
#19316 リミッター・レジストリの再起動やノードシャットダウン時にクリーンアップが実行されなかった場合、
persistent_termにレートリミッターのバケットエントリがリークする問題を修正しました。
ゲートウェイ
#19422 MQTT-SNセッションの引き継ぎが、EMQX 6.3.0、6.3.1、6.3.2へのローリングアップグレード中の混在バージョンクラスターで失敗する問題を修正しました。異なるバージョンのノードで再接続やウェイクアップするとクライアントチャネルが失敗またはクラッシュし、セッション再開や保留メッセージ配信が妨げられていました。
#19459 MQTT-SNゲートウェイが送信PUBLISHパケットから
DUPとRETAINフラグを省略する問題を修正しました。これによりクライアントは再送メッセージやサブスクリプション時に配信される保持メッセージを識別可能になりました。#19393 セッションを再開したゲートウェイクライアントへのQoS 1/2配信時に毎回エラーログが出る問題を修正しました。
メッセージキューやストリーム使用時に、フックコールバック内で例外が発生し、EMQXが
hook_callback_exceptionをエラーレベルでログ出力していました。配信自体は影響を受けません。MQTT-SNクライアントのスリープからのウェイクアップなど、セッションライフサイクルフックが実行されないゲートウェイチャネルは、コールバックが必要とするチャネルメタデータが設定されていませんでした。
アクセス制御
- #19282
hostname_resolution = dynamicのHTTP認証で、Content-Typeヘッダー名が小文字でないレスポンス(例:Content-Type: application/json)を拒否していた問題を修正しました。現在は受け入れられます。以前は認証バックエンドがunsupported_content_typeを返し、クライアントが接続できませんでした。
データ統合
#19313 HTTPベースのコネクター(HTTPサーバー、GCP PubSub Producer、Couchbase、Snowflakeなど)で応答がない接続の検出を改善しました。
修正前は、レスポンス待ちのリクエストがある接続は、リクエストタイムアウト(
resource_opts.request_ttl)+max_inactive経過後に再接続されていました。request_ttlが大きいと長時間かかり、request_ttl = infinityでは再接続されませんでした。修正後は、リクエスト待ちで60秒間リクエスト送信がない場合、または
max_inactiveがそれ以上の場合はmax_inactive後に再接続します。デフォルト設定(request_ttl45秒、max_inactive10秒)は影響を受けません。これにより、約50秒以上の
request_ttl設定のコネクターの動作が変わります。60秒を超えるレスポンスは再接続で中断される可能性があります。リモートサービスの応答が60秒以上かかる場合は、max_inactiveを想定最長応答時間以上に設定してください。
オブザーバビリティ
- #19561 ログハンドラーで
payload_encode = hiddenを設定した際のログフォーマッタクラッシュを修正しました。以前は、Cluster Linkingのrecv_dataイベントのdataフィールドのようなtermフィールドを含むデバッグログがFORMATTER CRASHレポートに置き換わっていました。現在はEncoded(hidden)=******としてマスクされ、通常通りログが書き込まれます。
ノードとクラスター
#19444 CPUクォータ下(例:
docker run --cpusや Kubernetes CPU制限)でのErlangスケジューラ数を修正しました。6.3.0以降、EMQXはホストのCPUコア数分のスケジューラを起動していましたが、コンテナが使用可能なCPU数に合わせていませんでした。スケジューラ間でCPUクォータを奪い合い、同じメッセージレートで約30%多くCPUを消費していました。現在はCPUクォータに合わせた数のスケジューラを起動します。明示的に設定する場合は
node.schedulersを使用してください。#19160 コアノードがクラスターに参加または離脱する際に発生する
mriaアプリケーションのクラッシュを修正しました。Reason: {badarg,[{ets,select,[gproc,[{{{{n,l,{mria_rlog_replica,route_shard_m,'$1'}},n},'$2','_'},[],[{{'$1','$2'}}]]],[{error_info,#{cause => id...この修正で、クラスターメンバー変更時に再起動されるビジネスレベルアプリケーションのリストから
mriaアプリのgproc依存を除外しました。#19578 ローリングアップグレード中の避難セッションインポート時のクラッシュを修正しました。セッションが古いEMQXバージョンのノード由来でリスナーメタデータが欠落している場合に発生していました。
#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接続のメモリ使用量を削減しました。
テナントクライアントのレートリミッター状態は、クライアントが初めてパブリッシュ、サブスクライブ、またはメッセージ受信する際に割り当て、実際に設定された制限のみ割り当てます。通常接続と同様の動作です。設定済みのテナントおよびクライアントレート制限は従来通り動作します。ネームスペースのリミッター設定が削除された場合、以降のリミッター検査は操作を拒否し続けます。
バグ修正
以下の詳細は省略しますが、6.3.1では多くのバグ修正が含まれています。アップグレード前にリリースノート全文をご確認ください。
(以下、6.3.0、6.2.3、6.2.2、6.2.1、6.2.0、6.1.5、6.1.4、6.1.3、6.1.2、6.1.1、6.1.0、6.0.4、6.0.3、6.0.2、6.0.1、6.0.0の各リリースノートも同様に翻訳されていますが、文字数制限のためここでは省略します。必要に応じて個別にご提供可能です。)