This is an automated email from the ASF dual-hosted git repository.

popduke pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/bifromq-sites.git


The following commit(s) were added to refs/heads/master by this push:
     new 7a4aa2a  1. add client balancer doc 2. update admin_guide 3. fix 
deploy warning
7a4aa2a is described below

commit 7a4aa2a6927326ea36f75af3c947d3cae5bba883
Author: Yonny Hao <[email protected]>
AuthorDate: Tue Jun 24 11:53:42 2025 +0800

    1. add client balancer doc
    2. update admin_guide
    3. fix deploy warning
---
 .github/workflows/ci.yml                           | 45 --------------
 .github/workflows/deploy-staging.yml               |  1 -
 .../admin_guide/configuration/bifromq_sys_props.md | 72 +++++++++-------------
 .../configuration/config_file_manual.md            | 12 ++--
 docs/admin_guide/configuration/configs_print.md    | 37 +++++------
 docs/benchmark/_category_.json                     |  8 +++
 docs/benchmark/intro.md                            |  7 +++
 docs/contribution_guide/_category_.json            |  8 +++
 docs/contribution_guide/intro.md                   |  7 +++
 docs/plugin/client_balancer.md                     | 58 +++++++++++++++++
 licenserc.toml                                     | 32 ----------
 11 files changed, 139 insertions(+), 148 deletions(-)

diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
deleted file mode 100644
index 88071e5..0000000
--- a/.github/workflows/ci.yml
+++ /dev/null
@@ -1,45 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-name: CI
-on:
-  pull_request:
-    branches: [master]
-  push:
-    branches: [master]
-
-# Concurrency strategy:
-#   github.workflow: distinguish this workflow from others
-#   github.event_name: distinguish `push` event from `pull_request` event
-#   github.event.number: set to the number of the pull request if 
`pull_request` event
-#   github.run_id: otherwise, it's a `push` event, only cancel if we rerun the 
workflow
-#
-# Reference:
-#   https://docs.github.com/en/actions/using-jobs/using-concurrency
-#   
https://docs.github.com/en/actions/learn-github-actions/contexts#github-context
-concurrency:
-  group: ${{ github.workflow }}-${{ github.event_name }}-${{ 
github.event.number || github.run_id }}
-  cancel-in-progress: true
-
-jobs:
-  check:
-    name: Check
-    runs-on: ubuntu-latest
-    steps:
-      - uses: actions/checkout@v4
-      - uses: korandoru/hawkeye@v4
-# TODO: enable markdownlint & typos
diff --git a/.github/workflows/deploy-staging.yml 
b/.github/workflows/deploy-staging.yml
index 42de205..9ccc712 100644
--- a/.github/workflows/deploy-staging.yml
+++ b/.github/workflows/deploy-staging.yml
@@ -42,4 +42,3 @@ jobs:
           github_token: ${{ secrets.GITHUB_TOKEN }}
           publish_dir: ./build
           publish_branch: asf-staging
-          clean: true
diff --git a/docs/admin_guide/configuration/bifromq_sys_props.md 
b/docs/admin_guide/configuration/bifromq_sys_props.md
index ca8261b..e7cddef 100644
--- a/docs/admin_guide/configuration/bifromq_sys_props.md
+++ b/docs/admin_guide/configuration/bifromq_sys_props.md
@@ -9,47 +9,31 @@ For example, setting `-Dmqtt_utf8_sanity_check=false` 
disables the check for MQT
 
 Below is a table listing the system properties supported by the current 
version:
 
-| Property Key                                 | Default Value         | 
Description                                                                     
                                                                                
                                                                                
                                                                                
                                                                                
                    [...]
-|----------------------------------------------|-----------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 [...]
-| `cluster_domain_resolve_timeout_seconds`     | 120                   | This 
parameter specifies the timeout duration for DNS resolution when constructing a 
cluster using the "clusterConfig.clusterDomainName". The process involves 
resolving the cluster domain to discover seed nodes that can join the cluster. 
A successful resolution is marked by obtaining a non-empty set of IP addresses. 
This parameter controls the maximum amount of time allowed for this DNS 
resolution to complete succes [...]
-| `ingress_slowdown_direct_memory_usage`       | 0.95                  | 
Threshold for slowing down the acceptance of ingress traffic based on direct 
memory usage. When the direct memory usage exceeds this threshold, the system 
will begin to slow down incoming traffic to manage resource consumption 
effectively.                                                                    
                                                                                
                                 [...]
-| `ingress_slowdown_heap_memory_usage`         | 0.9                   | 
Threshold for slowing down the acceptance of ingress traffic based on heap 
memory usage. When the heap memory usage exceeds this threshold, the system 
will initiate measures to slow down incoming traffic to prevent memory 
overload.                                                                       
                                                                                
                                      [...]
-| `max_slowdown_timeout_seconds`               | 5                     | 
Maximum duration (in seconds) that the slowdown mechanism is allowed to operate 
before further backpressure protection measures are taken. This ensures that if 
the slowdown is not sufficient to manage resource usage, additional steps will 
be implemented to protect the system.                                           
                                                                                
                     [...]
-| `mqtt_utf8_sanity_check`                     | false                 | 
Enables/disables UTF8 sanity checks according to MQTT-1.5.3.                    
                                                                                
                                                                                
                                                                                
                                                                                
                    [...]
-| `max_mqtt3_client_id_length`                 | 65535                 | 
Maximum client ID length for MQTT 3 clients.                                    
                                                                                
                                                                                
                                                                                
                                                                                
                    [...]
-| `max_mqtt5_client_id_length`                 | 65535                 | 
Maximum client ID length for MQTT 5 clients.                                    
                                                                                
                                                                                
                                                                                
                                                                                
                    [...]
-| `session_register_num`                       | 1000                  | 
Number of concurrent session registers.                                         
                                                                                
                                                                                
                                                                                
                                                                                
                    [...]
-| `data_plane_tolerable_latency_ms`            | 1000L                 | 
Tolerable latency in milliseconds for the data plane.                           
                                                                                
                                                                                
                                                                                
                                                                                
                    [...]
-| `data_plane_burst_latency_ms`                | 5000L                 | Burst 
latency in milliseconds for the data plane.                                     
                                                                                
                                                                                
                                                                                
                                                                                
              [...]
-| `control_plane_tolerable_latency_ms`         | 2000L                 | 
Tolerable latency in milliseconds for the control plane.                        
                                                                                
                                                                                
                                                                                
                                                                                
                    [...]
-| `control_plane_burst_latency_ms`             | 5000L                 | Burst 
latency in milliseconds for the control plane.                                  
                                                                                
                                                                                
                                                                                
                                                                                
              [...]
-| `dist_server_dist_worker_call_queues`        | CPU cores             | 
Number of dist worker call queues.                                              
                                                                                
                                                                                
                                                                                
                                                                                
                    [...]
-| `dist_worker_fanout_parallelism`             | Max(2, CPU cores)     | 
Parallelism level for fanout operations.                                        
                                                                                
                                                                                
                                                                                
                                                                                
                    [...]
-| `dist_worker_max_cached_subs_per_tenant`     | 200_000L              | 
Maximum cached subscriptions per tenant.                                        
                                                                                
                                                                                
                                                                                
                                                                                
                    [...]
-| `dist_worker_topic_match_expiry_seconds`     | 5                     | 
Expiry time in seconds for topic matches.                                       
                                                                                
                                                                                
                                                                                
                                                                                
                    [...]
-| `dist_worker_match_parallelism`              | Max(2, CPU cores / 2) | 
Parallelism level for match operations.                                         
                                                                                
                                                                                
                                                                                
                                                                                
                    [...]
-| `dist_worker_fanout_split_threshold`         | 100000                | 
Threshold for splitting fanout operations when fanout split hinter enabled.     
                                                                                
                                                                                
                                                                                
                                                                                
                    [...]
-| `dist_worker_split_max_cpu_usage`            | 0.8                   | 
Maximum CPU usage threshold for splitting operations when fanout split hinter 
enabled.                                                                        
                                                                                
                                                                                
                                                                                
                      [...]
-| `dist_worker_load_estimation_window_seconds` | 5L                    | Time 
window in seconds for load estimation when fanout split hinter enabled.         
                                                                                
                                                                                
                                                                                
                                                                                
               [...]
-| `dist_worker_split_io_nanos_limit`           | 30_000L               | 
Nanoseconds limit for I/O operations during split when fanout split hinter 
enabled.                                                                        
                                                                                
                                                                                
                                                                                
                         [...]
-| `dist_worker_split_max_io_density`           | 100                   | 
Maximum I/O density for split operations when fanout split hinter enabled.      
                                                                                
                                                                                
                                                                                
                                                                                
                    [...]
-| `dist_worker_range_voter_count`              | 3                     | 
Number of voters for range decisions.                                           
                                                                                
                                                                                
                                                                                
                                                                                
                    [...]
-| `dist_worker_recovery_timeout_millis`        | 10000L                | 
Timeout in milliseconds for worker recovery when recovery balancer enabled.     
                                                                                
                                                                                
                                                                                
                                                                                
                    [...]
-| `inbox_deliverers`                           | 100                   | 
Number of inbox deliverers.                                                     
                                                                                
                                                                                
                                                                                
                                                                                
                    [...]
-| `inbox_fetch_queues_per_range`               | Max(1, CPU cores / 4) | 
Number of fetch queues per range.                                               
                                                                                
                                                                                
                                                                                
                                                                                
                    [...]
-| `inbox_check_queues_per_range`               | 1                     | 
Number of check queues per range.                                               
                                                                                
                                                                                
                                                                                
                                                                                
                    [...]
-| `inbox_store_load_estimation_window_seconds` | 5L                    | Time 
window in seconds for load estimation in inbox store.                           
                                                                                
                                                                                
                                                                                
                                                                                
               [...]
-| `inbox_store_range_split_limit`              | Max(1, CPU cores / 4) | Range 
split will stop when local inbox store hits the limit.                          
                                                                                
                                                                                
                                                                                
                                                                                
              [...]
-| `inbox_store_range_split_max_cpu_usage`      | 0.8                   | 
Maximum CPU usage threshold for range split in inbox store.                     
                                                                                
                                                                                
                                                                                
                                                                                
                    [...]
-| `inbox_store_range_split_io_nanos_limit`     | 30_000                | 
Nanoseconds limit for I/O operations during range split in inbox store.         
                                                                                
                                                                                
                                                                                
                                                                                
                    [...]
-| `inbox_store_range_split_max_io_density`     | 100                   | 
Maximum I/O density for range split operations in inbox store.                  
                                                                                
                                                                                
                                                                                
                                                                                
                    [...]
-| `inbox_store_range_voter_count`              | 1                     | 
Number of voters for range decisions in inbox store.                            
                                                                                
                                                                                
                                                                                
                                                                                
                    [...]
-| `inbox_store_recovery_timeout_millis`        | 10000L                | 
Timeout in milliseconds for inbox store recovery.                               
                                                                                
                                                                                
                                                                                
                                                                                
                    [...]
-| `mqtt_deliverers_per_server`                 | CPU cores             | 
Number of MQTT deliverers per server.                                           
                                                                                
                                                                                
                                                                                
                                                                                
                    [...]
-| `retain_store_range_split_limit`             | Max(1, CPU cores / 4) | Range 
split will stop when local retain store hits the limit.                         
                                                                                
                                                                                
                                                                                
                                                                                
              [...]
-| `retain_store_range_split_max_cpu_usage`     | 0.8                   | 
Maximum CPU usage threshold for range split in retain store.                    
                                                                                
                                                                                
                                                                                
                                                                                
                    [...]
-| `retain_store_range_split_io_nanos_limit`    | 30_000L               | 
Nanoseconds limit for I/O operations during range split in retain store.        
                                                                                
                                                                                
                                                                                
                                                                                
                    [...]
-| `retain_store_range_split_max_io_density`    | 100                   | 
Maximum I/O density for range split operations in retain store.                 
                                                                                
                                                                                
                                                                                
                                                                                
                    [...]
-| `retain_store_range_voter_count`             | 3                     | 
Number of voters for range decisions in retain store.                           
                                                                                
                                                                                
                                                                                
                                                                                
                    [...]
-| `retain_store_load_est_window_seconds`       | 5L                    | Time 
window in seconds for load estimation in retain store.                          
                                                                                
                                                                                
                                                                                
                                                                                
               [...]
-| `retain_store_recovery_timeout_millis`       | 10000L                | 
Timeout in milliseconds for retain store recovery.                              
                                                                                
                                                                                
                                                                                
                                                                                
                    [...]
\ No newline at end of file
+| Property Key                                  | Default Value         | 
Description                                                                     
                                                                                
                                                                                
                                                                                
                                                                                
                   [...]
+| --------------------------------------------- | --------------------- | 
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 [...]
+| `client_redirect_check_interval_seconds`      | 600                   | The 
client redirection check interval in seconds                                    
                                                                                
                                                                                
                                                                                
                                                                                
               [...]
+| `cluster_domain_resolve_timeout_seconds`      | 120                   | This 
parameter specifies the timeout duration for DNS resolution when constructing a 
cluster using the "clusterConfig.clusterDomainName". The process involves 
resolving the cluster domain to discover seed nodes that can join the cluster. 
A successful resolution is marked by obtaining a non-empty set of IP addresses. 
This parameter controls the maximum amount of time allowed for this DNS 
resolution to complete succe [...]
+| `control_plane_burst_latency_ms`              | 5000L                 | The 
max latency in milliseconds tolerated for the control plane burst.              
                                                                                
                                                                                
                                                                                
                                                                                
               [...]
+| `data_plane_burst_latency_ms`                 | 5000L                 | The 
max latency in milliseconds tolerated for the data plane burst.                 
                                                                                
                                                                                
                                                                                
                                                                                
               [...]
+| `dist_server_dist_worker_call_queues`         | CPU cores             | 
Number of dist worker call queues.                                              
                                                                                
                                                                                
                                                                                
                                                                                
                   [...]
+| `dist_worker_inline_fanout_threshold`         | 1000                  | The 
threshold of the fanout to be executed in calling thread                        
                                                                                
                                                                                
                                                                                
                                                                                
               [...]
+| `dist_worker_fanout_parallelism`              | Max(2, CPU cores)     | 
Parallelism level for fanout operations.                                        
                                                                                
                                                                                
                                                                                
                                                                                
                   [...]
+| `dist_worker_fanout_split_threshold`          | 100000                | 
Threshold for splitting fanout operations when fanout split hinter enabled.     
                                                                                
                                                                                
                                                                                
                                                                                
                   [...]
+| `dist_worker_load_estimation_window_seconds`  | 5L                    | Time 
window in seconds for load estimation when fanout split hinter enabled.         
                                                                                
                                                                                
                                                                                
                                                                                
              [...]
+| `dist_worker_match_parallelism`               | Max(2, CPU cores / 2) | 
Parallelism level for match operations.                                         
                                                                                
                                                                                
                                                                                
                                                                                
                   [...]
+| `dist_worker_max_cached_subs_per_tenant`      | 200_000L              | 
Maximum cached subscriptions per tenant.                                        
                                                                                
                                                                                
                                                                                
                                                                                
                   [...]
+| `dist_worker_topic_match_expiry_seconds`      | 5                     | 
Expiry time in seconds for topic matches.                                       
                                                                                
                                                                                
                                                                                
                                                                                
                   [...]
+| `inbox_check_queues_per_range`                | 1                     | 
Number of check queues per range.                                               
                                                                                
                                                                                
                                                                                
                                                                                
                   [...]
+| `inbox_deliverers`                            | 100                   | 
Number of inbox deliverers.                                                     
                                                                                
                                                                                
                                                                                
                                                                                
                   [...]
+| `inbox_fetch_queues_per_range`                | Max(1, CPU cores / 4) | 
Number of fetch queues per range.                                               
                                                                                
                                                                                
                                                                                
                                                                                
                   [...]
+| `inbox_store_load_estimation_window_seconds`  | 5L                    | Time 
window in seconds for load estimation in inbox store.                           
                                                                                
                                                                                
                                                                                
                                                                                
              [...]
+| `ingress_slowdown_direct_memory_usage`        | 0.95                  | 
Threshold for slowing down the acceptance of ingress traffic based on direct 
memory usage. When the direct memory usage exceeds this threshold, the system 
will begin to slow down incoming traffic to manage resource consumption 
effectively.                                                                    
                                                                                
                                [...]
+| `ingress_slowdown_heap_memory_usage`          | 0.9                   | 
Threshold for slowing down the acceptance of ingress traffic based on heap 
memory usage. When the heap memory usage exceeds this threshold, the system 
will initiate measures to slow down incoming traffic to prevent memory 
overload.                                                                       
                                                                                
                                     [...]
+| `mqtt_utf8_sanity_check`                      | false                 | 
Enables/disables UTF8 sanity checks according to MQTT-1.5.3.                    
                                                                                
                                                                                
                                                                                
                                                                                
                   [...]
+| `max_mqtt3_client_id_length`                  | 65535                 | 
Maximum client ID length for MQTT 3 clients.                                    
                                                                                
                                                                                
                                                                                
                                                                                
                   [...]
+| `max_mqtt5_client_id_length`                  | 65535                 | 
Maximum client ID length for MQTT 5 clients.                                    
                                                                                
                                                                                
                                                                                
                                                                                
                   [...]
+| `max_slowdown_timeout_seconds`                | 5                     | 
Maximum duration (in seconds) that the slowdown mechanism is allowed to operate 
before further backpressure protection measures are taken. This ensures that if 
the slowdown is not sufficient to manage resource usage, additional steps will 
be implemented to protect the system.                                           
                                                                                
                    [...]
+| `mqtt_deliverers_per_server`                  | CPU cores             | 
Number of MQTT deliverers per server.                                           
                                                                                
                                                                                
                                                                                
                                                                                
                   [...]
+| `persistent_session_detach_timeout_second`    | 7200                  | The 
timeout seconds to consider persistent session is probably detached from mqtt 
client.                                                                         
                                                                                
                                                                                
                                                                                
                 [...]
+| `retain_store_load_estimation_window_seconds` | 5L                    | Time 
window in seconds for load estimation in retain store.                          
                                                                                
                                                                                
                                                                                
                                                                                
              [...]
+| `session_register_num`                        | 1000                  | 
Number of concurrent session registers.                                         
                                                                                
                                                                                
                                                                                
                                                                                
                   [...]
diff --git a/docs/admin_guide/configuration/config_file_manual.md 
b/docs/admin_guide/configuration/config_file_manual.md
index a82697f..602e637 100644
--- a/docs/admin_guide/configuration/config_file_manual.md
+++ b/docs/admin_guide/configuration/config_file_manual.md
@@ -11,9 +11,9 @@ The complete configuration file is defined by a set of 
configuration objects, wi
 ## StandaloneConfig
 
 | Configuration Name                                                   | Value 
Type             | Default Value              | Description                     
                                                                                
                                                                                
                                                                                
                                                                              |
-|----------------------------------------------------------------------|------------------------|----------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `bootstrap`                                                          | 
Boolean                | false                      | If the node is 
responsible for cluster bootstrapping, this value should be set to true. 
Otherwise, it should be set to false. Note: In cluster deployments, there must 
be **exactly one** bootstrap node.                                              
                                                                                
                       |
+| -------------------------------------------------------------------- | 
---------------------- | -------------------------- | 
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 |
 | `authProviderFQN`                                                    | 
String                 | null                       | Fully qualified class 
name of the custom Auth Provider implementation. If not configured, 
authentication and authorization will not be performed.                         
                                                                                
                                                                                
                    |
+| `clientBalancerFQN`                                                  | 
String                 | null                       | Fully qualified class 
name of the custom Client Balancer implementation. If not configured, no active 
redirection happens.                                                            
                                                                                
                                                                                
        |
 | `resourceThrottlerFQN`                                               | 
String                 | null                       | Fully qualified class 
name of the custom Resource Throttler implementation. If not configured, 
resource limiting will not be performed.                                        
                                                                                
                                                                                
               |
 | `settingProviderFQN`                                                 | 
String                 | null                       | Fully qualified class 
name of the custom Setting Provider implementation. If not configured, default 
initial values defined in Settings will be used.                                
                                                                                
                                                                                
         |
 | `clusterConfig.env`                                                  | 
String                 | "Test"                     | Cluster environment name. 
Cluster nodes with different environment names are isolated from each other. 
Cannot be null or an empty string.                                              
                                                                                
                                                                                
       |
@@ -90,7 +90,7 @@ SSLContextConfig is used to configure the SSL connection 
parameters for the clie
 If you leave SSLContextConfig or ServerSSLContextConfig set to null while the 
corresponding `enable` flags are set to true, a self-signed certificate will be 
generated, which is not recommended for production environments.
 
 | Configuration Name | Value Type | Default Value | Description                
                                                                                
                                                                                
                                                                                
                                                                                
                                      |
-|--------------------|------------|---------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| ------------------ | ---------- | ------------- | 
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 |
 | `certFile`         | String     | null          | The filename of the public 
certificate for the client or server.                                           
                                                                                
                                                                                
                                                                                
                                      |
 | `keyFile`          | String     | null          | The filename of the 
private key for the client or server.                                           
                                                                                
                                                                                
                                                                                
                                             |
 | `trustCertsFile`   | String     | null          | The filename of the root 
certificate for the client or server. If null, peer certification will not be 
verified, when clientAuth is OPTIONAL or REQUIRE.                               
                                                                                
                                                                                
                                          |
@@ -101,7 +101,7 @@ If you leave SSLContextConfig or ServerSSLContextConfig set 
to null while the co
 StorageEngineConfig is used to set the configuration parameters for the data 
engine and WAL engine of the built-in state service.
 
 | Configuration Name        | Value Type | Description                         
                                                                                
                                                                                
                                                                                
      |
-|---------------------------|------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| ------------------------- | ---------- | 
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 |
 | `type`                    | String     | Specifies the type of data engine 
used in the built-in storage service. Options include: rocksdb: Provides 
persistence functionality, allowing state to be recovered after a restart; 
memory: No persistence, data will be lost after a restart.                      
                    |
 | `dataPathRoot`            | String     | Effective when type is set to 
rocksdb. Specifies the directory to store data files. If configured as an 
absolute path, it will be directly loaded; if configured as a relative path, it 
will try to load from the directory specified by the `DATA_DIR` and `user.dir` 
system parameters. |
 | `compactMinTombstoneKeys` | Integer    | Effective when type is set to 
rocksdb. The number of Tombstone keys that trigger a compaction operation.      
                                                                                
                                                                                
            |
@@ -114,9 +114,9 @@ StorageEngineConfig is used to set the configuration 
parameters for the data eng
 BalancerOptions is used to set the configuration parameters for the Balancer 
of the built-in state service.
 
 | Configuration Name     | Value Type     | Default Value | Description        
                                                                                
                                                                |
-|------------------------|----------------|---------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| ---------------------- | -------------- | ------------- | 
------------------------------------------------------------------------------------------------------------------------------------------------------------------
 |
 | `scheduleIntervalInMs` | Long           | 5000          | The interval at 
which the Balancer attempts to balance the load.                                
                                                                   |
 | `balancers`            | List of String |               | The fully 
qualified names of the balancer implementations that are enabled. Different 
balancer implementations can be set for different built-in storage services. |
 
 Note: Adjusting the parameters related to StorageEngineConfig and 
BalancerOptions requires an in-depth understanding of the storage engine 
implementation of BifroMQ. Improper configuration may lead to abnormal behavior 
of the state storage
-service.
\ No newline at end of file
+service.
diff --git a/docs/admin_guide/configuration/configs_print.md 
b/docs/admin_guide/configuration/configs_print.md
index ec5e00f..9818159 100644
--- a/docs/admin_guide/configuration/configs_print.md
+++ b/docs/admin_guide/configuration/configs_print.md
@@ -17,7 +17,7 @@ The printed configuration information in the logs consists of 
four main parts:
 JVM parameters refer to the parameters passed to the JVM when starting BifroMQ 
using the `-D` parameter. An example of the printed output is as follows:
 
 ```text
-15:21:46.890 [main] INFO c.b.b.starter.StandaloneStarter - JVM arguments:
+15:21:46.890 [main] INFO o.a.b.starter.StandaloneStarter - JVM arguments:
 -Xms1045m
 -Xmx4096m
 
-Xlog:gc:file=/usr/share/bifromq-standalone/bin/../logs/gc-%t.log:time,tid,tags:filecount=5,filesize=50m
@@ -36,15 +36,15 @@ It is important to note that the printed values here 
represent the initial value
 necessarily be the actual runtime values. An example of the printed output is 
as follows:
 
 ```text
-15:21:46.890 [main] INFO c.b.b.starter.StandaloneStarter - Settings, which can 
be modified at runtime, allowing for dynamic adjustment of BifroMQ's service 
behavior per tenant. See https://bifromq.io/docs/plugin/setting_provider/
-15:21:46.890 [main] INFO c.b.b.starter.StandaloneStarter - Following is the 
initial value of each setting:
-15:21:46.913 [main] INFO c.b.b.starter.StandaloneStarter - Setting: 
DebugModeEnabled=false
-15:21:46.913 [main] INFO c.b.b.starter.StandaloneStarter - Setting: 
MaxTopicLevelLength=40
-15:21:46.913 [main] INFO c.b.b.starter.StandaloneStarter - Setting: 
MaxTopicLevels=16
-15:21:46.913 [main] INFO c.b.b.starter.StandaloneStarter - Setting: 
MaxTopicLength=255
-15:21:46.913 [main] INFO c.b.b.starter.StandaloneStarter - Setting: 
MaxSharedGroupMembers=200
-15:21:46.913 [main] INFO c.b.b.starter.StandaloneStarter - Setting: 
MaxTopicFiltersPerInbox=100
-15:21:46.913 [main] INFO c.b.b.starter.StandaloneStarter - Setting: 
MsgPubPerSec=200
+15:21:46.890 [main] INFO o.a.b.starter.StandaloneStarter - Settings, which can 
be modified at runtime, allowing for dynamic adjustment of BifroMQ's service 
behavior per tenant. See https://bifromq.io/docs/plugin/setting_provider/
+15:21:46.890 [main] INFO o.a.b.starter.StandaloneStarter - Following is the 
initial value of each setting:
+15:21:46.913 [main] INFO o.a.b.starter.StandaloneStarter - Setting: 
DebugModeEnabled=false
+15:21:46.913 [main] INFO o.a.b.starter.StandaloneStarter - Setting: 
MaxTopicLevelLength=40
+15:21:46.913 [main] INFO o.a.b.starter.StandaloneStarter - Setting: 
MaxTopicLevels=16
+15:21:46.913 [main] INFO o.a.b.starter.StandaloneStarter - Setting: 
MaxTopicLength=255
+15:21:46.913 [main] INFO o.a.b.starter.StandaloneStarter - Setting: 
MaxSharedGroupMembers=200
+15:21:46.913 [main] INFO o.a.b.starter.StandaloneStarter - Setting: 
MaxTopicFiltersPerInbox=100
+15:21:46.913 [main] INFO o.a.b.starter.StandaloneStarter - Setting: 
MsgPubPerSec=200
 ...
 ```
 
@@ -53,14 +53,12 @@ necessarily be the actual runtime values. An example of the 
printed output is as
 An example of the printed output is as follows:
 
 ```text
-17:21:34.067 [main] INFO  c.b.b.starter.StandaloneStarter - BifroMQ system 
properties:
-17:21:34.070 [main] INFO  c.b.b.starter.StandaloneStarter - BifroMQSysProp: 
mqtt_utf8_sanity_check=false
-17:21:34.070 [main] INFO  c.b.b.starter.StandaloneStarter - BifroMQSysProp: 
max_client_id_length=65535
-17:21:34.070 [main] INFO  c.b.b.starter.StandaloneStarter - BifroMQSysProp: 
session_register_num=1000
-17:21:34.070 [main] INFO  c.b.b.starter.StandaloneStarter - BifroMQSysProp: 
data_plane_tolerable_latency_ms=100
-17:21:34.070 [main] INFO  c.b.b.starter.StandaloneStarter - BifroMQSysProp: 
data_plane_burst_latency_ms=1000
-17:21:34.070 [main] INFO  c.b.b.starter.StandaloneStarter - BifroMQSysProp: 
control_plane_tolerant_latency_ms=200
-17:21:34.070 [main] INFO  c.b.b.starter.StandaloneStarter - BifroMQSysProp: 
control_plane_burst_latency_ms=5000
+17:21:34.067 [main] INFO  o.a.b.starter.StandaloneStarter - BifroMQ system 
properties:
+17:21:34.070 [main] INFO  o.a.b.starter.StandaloneStarter - BifroMQSysProp: 
mqtt_utf8_sanity_check=false
+17:21:34.070 [main] INFO  o.a.b.starter.StandaloneStarter - BifroMQSysProp: 
max_client_id_length=65535
+17:21:34.070 [main] INFO  o.a.b.starter.StandaloneStarter - BifroMQSysProp: 
session_register_num=1000
+17:21:34.070 [main] INFO  o.a.b.starter.StandaloneStarter - BifroMQSysProp: 
data_plane_burst_latency_ms=1000
+17:21:34.070 [main] INFO  o.a.b.starter.StandaloneStarter - BifroMQSysProp: 
control_plane_burst_latency_ms=5000
 ...
 ```
 
@@ -69,9 +67,8 @@ An example of the printed output is as follows:
 The configuration file section will include the consolidated complete content 
of the configuration file, with an example of the output as follows:
 
 ```text
-17:21:34.098 [main] INFO  c.b.b.starter.StandaloneStarter - Consolidated 
Config:
+17:21:34.098 [main] INFO  o.a.b.starter.StandaloneStarter - Consolidated 
Config:
 ---
-bootstrap: true
 clusterConfig:
   env: "Test"
   host: "127.0.0.1"
diff --git a/docs/benchmark/_category_.json b/docs/benchmark/_category_.json
new file mode 100644
index 0000000..3e4d855
--- /dev/null
+++ b/docs/benchmark/_category_.json
@@ -0,0 +1,8 @@
+{
+  "label": "Benchmark",
+  "position": 8,
+  "link": {
+    "type": "doc",
+    "id": "benchmark/overview"
+  }
+}
diff --git a/docs/benchmark/intro.md b/docs/benchmark/intro.md
new file mode 100644
index 0000000..627292c
--- /dev/null
+++ b/docs/benchmark/intro.md
@@ -0,0 +1,7 @@
+---
+id: "overview"
+sidebar_position: 0
+title: "Benchmark Overview"
+---
+
+Coming Soon...
diff --git a/docs/contribution_guide/_category_.json 
b/docs/contribution_guide/_category_.json
new file mode 100644
index 0000000..de642b8
--- /dev/null
+++ b/docs/contribution_guide/_category_.json
@@ -0,0 +1,8 @@
+{
+  "label": "Contribution",
+  "position": 9,
+  "link": {
+    "type": "doc",
+    "id": "contribution_guide/overview"
+  }
+}
diff --git a/docs/contribution_guide/intro.md b/docs/contribution_guide/intro.md
new file mode 100644
index 0000000..bf83027
--- /dev/null
+++ b/docs/contribution_guide/intro.md
@@ -0,0 +1,7 @@
+---
+id: "overview"
+sidebar_position: 0
+title: "Contribution Guide"
+---
+
+Coming Soon...
diff --git a/docs/plugin/client_balancer.md b/docs/plugin/client_balancer.md
index aada774..f52d6cc 100644
--- a/docs/plugin/client_balancer.md
+++ b/docs/plugin/client_balancer.md
@@ -2,3 +2,61 @@
 sidebar_position: 2
 title: "Client Balancer"
 ---
+
+The Client Balancer plugin enables BifroMQ to inject redirection strategies at 
runtime, providing active control over client connections to manage load 
distribution.
+
+To integrate the Client Balancer plugin into your BifroMQ deployment, include 
the following Maven dependency:
+
+```xml
+<dependency>
+    <groupId>org.apache.bifromq</groupId>
+    <artifactId>bifromq-plugin-client-balancer</artifactId>
+    <version>X.Y.Z</version> <!-- Replace X.Y.Z with the latest version number 
-->
+</dependency>
+```
+
+## Configuration
+
+BifroMQ operates with a single `ClientBalancer` instance. You must specify the 
fully qualified class name (FQN) of your implementation in the [configuration 
file](../admin_guide/configuration/config_file_manual.md):
+
+```yaml
+clientBalancerFQN: "YOUR_CLIENT_BALANCER_CLASS"
+```
+
+## Client Redirection
+
+The `ClientBalancer` interface defines a single method that is invoked by 
BifroMQ to decide whether a client connection should be redirected:
+
+```java
+Optional<Redirection> needRedirect(ClientInfo clientInfo);
+```
+
+When BifroMQ determines it's time to evaluate redirection, it calls this 
method. If a non-empty `Optional` is returned, the client connection will be 
actively disconnected based on the returned redirection hint.
+
+The `Redirection` record carries the disconnection hint:
+
+```java
+public record Redirection(boolean permanentMove, Optional<String> 
serverReference) { }
+```
+
+When the client uses the MQTT 5.0 protocol, BifroMQ maps the redirection 
information to MQTT disconnect semantics:
+
+- If `permanentMove` is `true`, the client receives `Server moved (0x9D)` 
reason code.
+- If `permanentMove` is `false`, the client receives `Use another server 
(0x9C)` reason code.
+- If `serverReference` is present, its value is included in the `Server 
Reference` field of the disconnect packet.
+
+## Redirection Evaluation Timing
+
+- **Post-authentication check**: Immediately after a client's authentication, 
BifroMQ invokes `needRedirect` to determine if the connection should be 
redirected.
+- **Periodic check**: For already established connections, BifroMQ 
periodically invokes `needRedirect` to evaluate if a redirection is needed.
+
+The default periodic check interval is **600 seconds**. This interval can be 
adjusted using the [system 
property](../admin_guide/configuration/bifromq_sys_props.md): 
`client_redirect_check_interval_seconds`
+
+## Performance Considerations
+
+The `ClientBalancer` executes within BifroMQ's core worker threads. Its 
implementation should remain lightweight and efficient to avoid degrading 
system performance.
+
+BifroMQ collects metrics to monitor the plugin's performance:
+
+- **`call.exec.timer`**: Tracks the execution duration and frequency of 
`needRedirect` invocations.
+- **`call.exec.fail.count`**: Counts the number of exceptions thrown during 
`needRedirect` calls.
diff --git a/licenserc.toml b/licenserc.toml
deleted file mode 100644
index dda7ce0..0000000
--- a/licenserc.toml
+++ /dev/null
@@ -1,32 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-headerPath = "Apache-2.0-ASF.txt"
-
-excludes = [
-  # Website generated files
-  "build",
-  ".docusaurus",
-
-  # Documents
-  "**/*.md",
-  "**/*.mdx",
-
-  # Meta files
-  "NOTICE",
-  ".nojekyll",
-]

Reply via email to