EMQX Enterprise 5.7リリース: 永続セッション、メッセージスキーマ検証、高度なルールエンジン機能

![EMQX Enterprise 5.7 Released: Durable Sessions, Message Schema Validation, and Advanced Rule Engine Capabilities](https://assets.emqx.com/images/c6c15abc827c73c78eb5501031e43ae2.jpg?imageMogr2/thumbnail/1520x684)

[EMQX Enterprise](https://www.emqx.com/en/products/emqx) 5.7.0がリリースされました！

このリリースでは、永続セッション、メッセージスキーマ検証、ルールエンジンのデバッグとトレース機能の強化など、いくつかの新機能と改良が導入されています。さらに、全体的なパフォーマンスと安定性をさらに向上させるために、多数の機能強化とバグ修正が実施されました。

## 永続セッション

EMQXの新しい永続セッション機能は、堅牢な永続性と高可用性を提供します。これにより、MQTTの永続セッションとそのメッセージをディスクに保存でき、セッションのメタデータとMQTTメッセージがEMQXクラスタ内の複数のノード間で継続的にレプリケーションされます。

![EMQX cluster](https://assets.emqx.com/images/2b18b36064c0b25e06d6d4dbfa835093.png?imageMogr2/thumbnail/1520x)

この機能は柔軟な設定オプションを提供し、レプリケーション係数を調整することで、メッセージまたはセッションごとのレプリカ数をカスタマイズできます。これにより、永続性とパフォーマンスのバランスを取ることができます。

MQTTメッセージを共有のレプリケートされた永続ストレージに保存することで、オンラインセッションとオフラインセッションの両方のメモリ使用量を削減し、インメモリストレージよりも大きなセッションとより多くのメッセージ処理容量をサポートします。永続セッションはまた、効果的なフェイルオーバーと復旧メカニズムを可能にすることで、システムの信頼性を高め、サービスの継続性と高可用性を確保します。

[詳細はこちら](https://docs.emqx.com/en/enterprise/v5.7/durability/durability_introduction.html)

## メッセージスキーマ検証

EMQXの組み込みスキーマ検証機能は、MQTTメッセージの構造と形式が正しいことを保証します。必要な形式に準拠していないメッセージは破棄したり、クライアントから切断したりすることができ、ログが生成され、ルールエンジンのイベントがトリガーされて、さらに処理されます。

スキーマ検証は、JSON Schema、Protobuf、Avroなどの様々な形式をサポートしています。また、組み込みのSQL文を使用して、特定のトピックからのメッセージ形式を検証することもできます。準拠していないメッセージを早期に検出してブロックすることで、スキーマ検証はシステムの安定性と信頼性を確保します。

検証に加えて、同じスキーマをEMQXルールエンジンのスキーマエンコード/デコードおよびスキーマチェック機能、並びに外部データシステムとビジネスプロセスにも使用でき、ユーザーは以下を実現できます。

- **データの整合性**: MQTTメッセージの構造と形式を検証することで、データの一貫性と正確性を確保します。
- **データ品質**: 欠落や無効なフィールド、データ型、フォーマットをチェックすることで、データ品質を維持します。
- **統一データモデル**: チームやプロジェクト全体で統一したデータモデルを適用することで、データの不整合やエラーを減らします。
- **再利用と共有**: チームメンバーがスキーマを再利用して共有できるようにすることで、コラボレーションを強化し、作業の重複とエラーを減らします。

[詳細はこちら](https://docs.emqx.com/en/enterprise/v5.7/data-integration/schema-validation.html)

## ルールのデバッグとトレースをサポート

ルールエンジンには、デバッグとトラッキングの機能が強化されました。シミュレートされたデータまたは実際のクライアントを使用してルールをトリガーし、ルールのSQLと関連するすべてのアクションを実行し、各ステップの実行結果を表示できるようになりました。

以下は、この機能のスクリーンショットです。ルールのSQLまたはアクションの実行に失敗した場合、ダッシュボードにエラーログが表示され、対応するアクションをすばやく特定し、構造化されたエラーメッセージを表示してトラブルシューティングを行うことができます。

![Rule Supports Debugging and Tracing](https://assets.emqx.com/images/46459849806919421c82741d6d71439a.png?imageMogr2/thumbnail/1520x)

スクリーンショットでは、ルールが4回トリガーされたことがわかります。最初の3回の実行は完全に成功しましたが、4回目はHTTPサービスアクションでエラーが発生したため失敗しました。エラーログを確認すると、HTTPサーバーが302ステータスコードで応答したために失敗したことがわかります。

以前のSQLテストとは異なり、ルールのデバッグとトラッキング機能は、ルール全体が期待通りに機能することを検証し、トラブルシューティングと問題解決を迅速に行うことを容易にします。これにより、開発が加速されるだけでなく、実際の実行中の障害を防ぎ、実際のシナリオでルールが正しく実行されることが保証されます。

[詳細はこちら](https://docs.emqx.com/en/enterprise/v5.7/data-integration/rule-get-started.html#test-rule)

## 合理化された変数入力によるルールアクションの強化

以前のリリースでは、ルールアクションで `${var}` プレースホルダー構文を使用して、動的に構築されたHTTPリクエスト、MySQL INSERT文、AWS S3オブジェクトキーなどの柔軟な設定のために、変数をルール処理に組み込むことができました。

この機能は大きな柔軟性を提供しましたが、ユーザーは現在のルールSQLで利用可能な変数を手動で特定して入力する必要があり、時間がかかり、エラーが発生しやすくなっていました。

このリリースでは、ダッシュボードのアクション設定ページに、プレースホルダー変数をサポートするフィールドの動的入力ヒントが含まれるようになりました。エディタのコードヒントと同様に、利用可能な変数は現在のルールSQLから自動的に導出され、入力時にユーザーに利用可能な値がすぐに表示されます。この機能強化により、設定プロセスが簡素化され、エラーの可能性が大幅に削減されます。

![Rule Action](https://assets.emqx.com/images/b4226886ac5b842bb900887e1e04165e.png?imageMogr2/thumbnail/1520x)

## ログトラッキング機能の強化

ログトラッキングに2つの新機能が追加されました。

1. **ルールIDを指定して実行結果をトレース**: この機能により、特定のルールの実行を正確にトレースしてデバッグできます。ログ出力には、ルールのSQL実行結果とルール内のすべてのアクションのログが含まれるため、問題をすばやく特定して解決できます。
2. **ログ出力形式をJSONに設定**: この機能により、ログの自動処理と分析が容易になり、データ処理の効率が向上します。

[詳細はこちら](https://docs.emqx.com/en/enterprise/v5.7/observability/tracer.html#trace-by-rule-id)

## クライアント属性

EMQXのクライアント属性では、キーと値のペアを使用してクライアントに追加の属性を設定できます。 

属性値は、MQTTクライアントの接続情報(ユーザー名、クライアントID、TLS証明書など)から取得したり、認証に成功した場合に返されるデータに基づいて設定したりできます。例えば、クライアントの接続時にクライアントIDをコロン(:)で分割し、最初のセグメントをVIN属性として使用するようにEMQXを設定できます。

```abnf
mqtt.client_attrs_init = [
  {
    expression = "nth(1, tokens(clientid, ':'))"
    set_as_attr = "VIN" 
  }
]
```

これらの属性は、認証と認可、データ統合、MQTT拡張など、EMQXの様々な機能で利用できます。例えば、MySQL認可チェックでは、VIN属性に基づいてクライアントのパブリッシュ/サブスクライブ権限を決定するSQLクエリを設定できます。

```sql
SELECT
  permission, action, topic, qos, retain  
FROM mqtt_acl
  WHERE VIN = ${client_attrs.VIN}
```

クライアントIDなどの静的な属性を使用する場合と比較して、クライアント属性は様々なビジネスシナリオでより大きな柔軟性を提供します。これにより、開発プロセスが簡素化され、適応性と効率性が向上します。

[詳細はこちら](https://docs.emqx.com/en/enterprise/v5.7/client-attributes/client-attributes.html)

## JWT認証の有効期限が切れたときにクライアントを切断

JWT仕様には有効期限属性が含まれており、トークンを発行するときに有効期限を設定します。以前のEMQXのJWT認証では、この属性をクライアント接続時にのみチェックしていたため、JWTの期限が切れた後もクライアントが接続したままになっていました。

このリリースでは、JWTの有効期限が切れるとクライアントを切断する機能がEMQXに導入されました。この機能はデフォルトで有効になっており、システムのセキュリティを強化し、潜在的な脆弱性を防ぎます。

以前の動作を維持するには、JWT認証の設定で **Disconnect After Expiration** オプションを無効にします。

![JWT Authentication](https://assets.emqx.com/images/8ac058d5c642d47567312b954713554d.png?imageMogr2/thumbnail/1520x)

[詳細はこちら](https://docs.emqx.com/en/enterprise/v5.7/access-control/authn/jwt.html)

## ホット設定とカスタマイズ可能なUIのプラグインサポート

以前のEMQXは、カスタマイズされた機能を拡張するためのプラグインをサポートしていましたが、ユーザーが手動で設定パラメータを入力する必要がある場合がありました。

このリリースでは、プラグインのホット設定機能が導入され、ユーザーはAvro Schemaを介してパラメータ設定を管理するために必要なUIページを定義できるようになりました。これらのページは、EMQXダッシュボードのプラグイン管理ページで自動的にロードされます。

開発者は、バックエンドのビジネスロジックの実装のみに集中でき、システムがUIページを自動的に生成するため、開発作業が軽減されます。ユーザーにとっては、プラグインのパラメータを直感的に設定できるようになり、ユーザーエクスペリエンスが向上します。

この機能はオプションであり、必要に応じて純粋なバックエンド開発を継続できます。

[詳細はこちら](https://docs.emqx.com/en/enterprise/v5.7/extensions/plugins.html#write-configuration-schema-for-the-plugin-optional)

## その他の機能

1. Apache IoTDBデータ統合がIoTDB v1.3.0をサポートし、バッチ挿入機能を導入して、データ書き込みのパフォーマンスを向上させました。
2. 組み込み認証データベースにエラースキーマをインポートする際に、より具体的なエラー情報が提供され、ユーザーが問題をより迅速に特定できるようになりました。 
3. RocketMQが名前空間とキースケジューリングポリシーをサポートするようになり、AliCloudでホストされているRocketMQとシームレスに統合できるようになりました。

## バグ修正

このリリースに含まれる主なバグ修正は次のとおりです。

- [#12653](https://github.com/emqx/emqx/pull/12653) ルールエンジンのbin2hexstr関数が、subbits関数から返されるような8で割り切れないビットサイズの引数を適切にサポートするようになりました。

- [#12657](https://github.com/emqx/emqx/pull/12657) ルールエンジンのS

- QLが配列要素として任意の式を許可しなかった問題が解決されました。これで、次のように、任意の式を配列要素として使用できるようになりました。

  ```sql
  SELECT
    [21 + 21, abs(-abs(-2)), [1 + 1], 4] as my_array
  FROM
    "t/#"  
  ```

  - [#12765](https://github.com/emqx/emqx/pull/12765) subscribers.countとsubscribers.maxが共有サブスクライバーを正しく含むようになりました。以前は、非共有サブスクライバーのみが含まれていました。

  - [#12812](https://github.com/emqx/emqx/pull/12812) ヘルスチェックが原因でコネクタがブロックされ、コネクタの更新または削除がタイムアウトする問題を修正しました。

  - [#12996](https://github.com/emqx/emqx/pull/12996) 保持メッセージのemqx_retainerプロセスのリークを修正しました。以前は、保持メッセージを受信している間にクライアントが切断されると、プロセスがリークする可能性がありました。

  - [#12871](https://github.com/emqx/emqx/pull/12871) ノードのリバランスが原因でノードの起動に問題が発生する問題を解決しました。以前は、ノードのリバランス中にEMQXがシャットダウンされると、再起動しませんでした。

  - [#12888](https://github.com/emqx/emqx/pull/12888) バックアップデータのインポート後にライセンス関連の設定が失われる問題を修正しました。

  - [#12895](https://github.com/emqx/emqx/pull/12895) DynamoDBコネクタとアクションに必要だが欠落していた設定を追加しました。

  機能の変更とバグ修正の詳細については、[EMQX Enterprise 5.7.0の変更ログ](https://www.emqx.com/en/changelogs/enterprise/5.7.0)を参照してください。