Project: EMQ Technologies (App Definition and Development / Streaming & Messaging)
File: v5.5.0.en.md

EMQX has been upgraded to leverage the capabilities of OTP version 26.1.2-2. NOTE: Docker images are still built with OTP 25.3.2. Enhanced the claim format in EMQX JWT authentication for greater versatility. The updated format now supports an array structure, aligning more closely with the file-based ACL rules. For example: ```json [ { "permission": "allow", "action": "pub", "topic": "${username}/#", "qos": [0, 1], "retain": true }, { "permission": "allow", "action": "sub", "topic": "eq ${username}/#", "qos": [0, 1] }, { "permission": "deny", "action": "all", "topics": ["#"] } ] ``` In this new format, the absence of a matching rule does not result in an automatic denial of the action. The authorization chain can advance to other configured authorizers if a match is not found in the JWT ACL. If no match is found throughout the chain, the final decision defers to the default permission set in `authorization.no_match`. Added a new `timeout` parameter to the `cluster/:node/invite` interface, addressing the issue of default timeouts. The previously set 5-second default timeout often led to HTTP API call timeouts because joining an EMQX cluster usually requires more time. In addition, EMQX added a new API `/cluster/:node/invite_async` to support an asynchronous way to invite nodes to join the cluster and introduced a new `cluster/invitation` API to inspect the join status. Introduced updates to the `retain` API in EMQX: Added a new API `DELETE /retainer/messages` to clean all retained messages. Added an optional topic filter parameter `topic` in the query string for the API `GET /retainer/messages`. For example, using a query string `topic=t/1` filters the retained messages for a specific topic, improving the efficiency of message retrieval. Added `mqtt/delayed/messages/:topic` API to remove delayed messages by topic name. Adjusted the maximum pagination size for paginated APIs in the REST API from `3000` to `10000`. Authorization caching now supports the exclusion of specific topics. For the specified list of topics and topic filters, EMQX will not generate an authorization cache. The list can be set through the `authorization.cache.excludes` configuration item or via the Dashboard. For these specific topics, permission checks will always be conducted in real-time rather than relying on previous cache results, thus ensuring the timeliness of authorization outcomes. Added `broker.routing.batch_sync` configuration item to enable a dedicated process pool that synchronizes subscriptions with the global routing table in batches, thus reducing the frequency of cross-node communication that can be slowed down by network latency. Processing multiple subscription updates collectively, not only accelerates synchronization between replica nodes and core nodes in a cluster but also reduces the load on the broker pool, minimizing the risk of overloading. Added a `tags` field for actions and

Similar to the `description` field (which is a free text annotation), `tags` can be used to annotate actions and connectors for filtering and grouping. Exposed more metrics to improve observability: Montior API: Added `retainedmsgcount` field to `/api/v5/monitor_current`. Added `licensequota` field to `/api/v5/monitorcurrent` Added `retainedmsgcount` and `nodeuptime` fields to `/api/v5/monitorcurrent/nodes/{node}`. Added `retainedmsgcount`, `licensequota` and `nodeuptime` fields to `/api/v5/monitor_current/nodes/{node}`. Prometheus API: Added `emqxcertexpiryat` and `emqxlicenseexpiryat` to `/api/v5/prometheus/stats` to display TLS listener certificate expiration time and license expiration time. Added `/api/v5/prometheus/auth` endpoint to provide metrics such as execution count and running status for all authenticatiors and authorizators. Added `/api/v5/prometheus/data_integration` endpoint to provide metrics such as execution count and status for all rules, actions, and connectors. Limitations: Prometheus push gateway only supports the content in `/api/v5/prometheus/stats?mode=node`. For more API details and metric type information, please see swagger api docs. Improved network efficiency during routes cleanup. Previously, when a node was down, a delete operation for each route to that node must be exchanged between all the other live nodes. After this change, only one `match and delete` operation is exchanged between all live nodes, significantly reducing the number of necessary network packets and decreasing the load on the inter-cluster network. This optimization must be especially helpful for geo-distributed EMQX deployments where network latency can be significantly high. The concurrent creation and updates of data integrations are now supported, significantly increasing operation speeds, such as when importing backup files. Fixed an issue when cluster commit log table was not deleted after a node was forced to leave a cluster. Fixed a family of subtle race conditions that could lead to inconsistencies in the global routing state. Improved error handling in the `/clients` interface; now returns a 400 status with more detailed error messages, instead of a generic 500, for query string validation failures. Updated the CoAP gateway to support short parameter names for slight savings in datagram size. For example, `clientid=bar` can be written as `c=bar`. Fixed the message indexing in retainer. Previously, clients with wildcard subscriptions might receive irrelevant retained messages not matching their subscription topics. Corrected an issue with incomplete client/connection information being passed into `emqx_cm`, which could lead to internal inconsistencies and affect memory usage and operations like node evacuation. Fixed an issue preventing the connectivity test for the Connector from functioning correctly after updating the password parameter via the HTTP API. Fixed an issue causing error messages when restarting a node configured with some types of data bridges. Additionally, these bridges were at risk of entering a failed state upon node restart, requiring a manual restart to restore functionality. Fixed an issue where restarting a data integration with heavy message flow could lead to a stop in the collection of data integration metrics.