diff --git a/apps/emqx/etc/emqx.conf b/apps/emqx/etc/emqx.conf index 0b877cf0b..2dc213b75 100644 --- a/apps/emqx/etc/emqx.conf +++ b/apps/emqx/etc/emqx.conf @@ -649,10 +649,12 @@ mqtt { ## The backoff for MQTT keepalive timeout. The broker will kick a connection out ## until 'Keepalive * backoff * 2' timeout. + ## There is one exception: + ## If the client connects successfully and then does not send any more packets, + ## it will be kicked out until 'Keepalive * backoff * 3'. ## ## @doc mqtt.keepalive_backoff ## ValueType: Float - ## Range: (0.5, 1] ## Default: 0.75 keepalive_backoff = 0.75 diff --git a/apps/emqx/src/emqx_schema.erl b/apps/emqx/src/emqx_schema.erl index 935bef979..2cda55aff 100644 --- a/apps/emqx/src/emqx_schema.erl +++ b/apps/emqx/src/emqx_schema.erl @@ -155,7 +155,8 @@ roots(medium) -> roots(low) -> [ {"force_gc", sc(ref("force_gc"), - #{})} + #{ desc => "Force the MQTT connection process GC after this number of messages or bytes passed through." + })} , {"conn_congestion", sc(ref("conn_congestion"), #{})} @@ -288,131 +289,185 @@ fields("cache") -> fields("mqtt") -> [ {"idle_timeout", sc(hoconsc:union([infinity, duration()]), - #{ default => "15s" + #{ default => "15s", + desc => +"""How long time the MQTT connection will be disconnected if the +TCP connection is established but MQTT CONNECT has not been received.""" })} , {"max_packet_size", sc(bytesize(), - #{ default => "1MB" + #{ default => "1MB", + desc => "Maximum MQTT packet size allowed." })} , {"max_clientid_len", sc(range(23, 65535), - #{ default => 65535 + #{ default => 65535, + desc => "Maximum length of MQTT clientId allowed." })} , {"max_topic_levels", sc(range(1, 65535), - #{ default => 65535 + #{ default => 65535, + desc => "Maximum topic levels allowed." })} , {"max_qos_allowed", sc(range(0, 2), - #{ default => 2 + #{ default => 2, + desc => "Maximum QoS allowed." })} , {"max_topic_alias", sc(range(0, 65535), - #{ default => 65535 + #{ default => 65535, + desc => "Maximum Topic Alias, 0 means no topic alias supported." })} , {"retain_available", sc(boolean(), - #{ default => true + #{ default => true, + desc => "Supports MQTT retained messages." })} , {"wildcard_subscription", sc(boolean(), - #{ default => true + #{ default => true, + desc => "Supports MQTT Wildcard Subscriptions." })} , {"shared_subscription", sc(boolean(), - #{ default => true + #{ default => true, + desc => "Supports MQTT Shared Subscriptions" })} , {"ignore_loop_deliver", sc(boolean(), - #{ default => false + #{ default => false, + desc => "Ignore loop delivery of messages for mqtt v3.1.1" })} , {"strict_mode", sc(boolean(), - #{default => false + #{default => false, + desc => "Parse the MQTT frame in strict mode" }) } , {"response_information", sc(string(), - #{default => "" + #{default => "", + desc => +"""Specify the response information returned to the client +This feature is disabled if is set to \"\".""" }) } , {"server_keepalive", sc(hoconsc:union([integer(), disabled]), - #{ default => disabled + #{ default => disabled, + desc => "Server Keep Alive of MQTT 5.0" }) } , {"keepalive_backoff", sc(float(), - #{default => 0.75 + #{default => 0.75, + desc => +"""The backoff for MQTT keepalive timeout. The broker will kick a connection out +until 'Keepalive * backoff * 2' timeout. +There is one exception: +If the client connects successfully and then does not send any more packets, +it will be kicked out until 'Keepalive * backoff * 3'.""" }) } , {"max_subscriptions", sc(hoconsc:union([range(1, inf), infinity]), - #{ default => infinity + #{ default => infinity, + desc => "Maximum number of subscriptions allowed." }) } , {"upgrade_qos", sc(boolean(), - #{ default => false + #{ default => false, + desc => "Force to upgrade QoS according to subscription." }) } , {"max_inflight", sc(range(1, 65535), - #{ default => 32 + #{ default => 32, + desc => "Maximum size of the Inflight Window storing QoS1/2 messages delivered but unacked." }) } , {"retry_interval", sc(duration(), - #{default => "30s" + #{ default => "30s", + desc => "Retry interval for QoS1/2 message delivering." }) } , {"max_awaiting_rel", sc(hoconsc:union([integer(), infinity]), - #{ default => 100 + #{ default => 100, + desc => "Maximum QoS2 packets (Client -> Broker) awaiting PUBREL." }) } , {"await_rel_timeout", sc(duration(), - #{ default => "300s" + #{ default => "300s", + desc => "The QoS2 messages (Client -> Broker) will be dropped if awaiting PUBREL timeout." }) } , {"session_expiry_interval", sc(duration(), - #{ default => "2h" + #{ default => "2h", + desc => "Default session expiry interval for MQTT V3.1.1 connections." }) } , {"max_mqueue_len", sc(hoconsc:union([range(0, inf), infinity]), - #{ default => 1000 + #{ default => 1000, + desc => +"""Maximum queue length. Enqueued messages when persistent client disconnected, +or inflight window is full.""" }) } , {"mqueue_priorities", sc(hoconsc:union([map(), disabled]), - #{ default => disabled + #{ default => disabled, + desc => +"""Topic priorities.
+There's no priority table by default, hence all messages are treated equal.
+Priority number [1-255]
+ +**NOTE**: comma and equal signs are not allowed for priority topic names
+**NOTE**: Messages for topics not in the priority table are treated as +either highest or lowest priority depending on the configured value for mqtt.mqueue_default_priority +

+**Examples**: +To configure \"topic/1\" > \"topic/2\": +mqueue_priorities: {\"topic/1\": 10, \"topic/2\": 8}""" }) } , {"mqueue_default_priority", sc(hoconsc:enum([highest, lowest]), - #{ default => lowest + #{ default => lowest, + desc => "Default to highest priority for topics not matching priority table" }) } , {"mqueue_store_qos0", sc(boolean(), - #{ default => true + #{ default => true, + desc => "Support enqueue QoS0 messages." }) } , {"use_username_as_clientid", sc(boolean(), - #{ default => false + #{ default => false, + desc => "use username replace client id" }) } , {"peer_cert_as_username", sc(hoconsc:enum([disabled, cn, dn, crt, pem, md5]), - #{ default => disabled + #{ default => disabled, + desc => +"""Use the CN, DN or CRT field from the client certificate as a username. +Only works for SSL connection.""" })} , {"peer_cert_as_clientid", sc(hoconsc:enum([disabled, cn, dn, crt, pem, md5]), - #{ default => disabled + #{ default => disabled, + desc => +"""Use the CN, DN or CRT field from the client certificate as a clientid. +Only works for SSL connection.""" })} ]; @@ -529,14 +584,16 @@ fields("force_gc") -> [ {"enable", sc(boolean(), #{ default => true - })} + })} , {"count", sc(range(0, inf), - #{ default => 16000 + #{ default => 16000, + desc => "GC the process after how many messages received" })} , {"bytes", sc(bytesize(), - #{ default => "16MB" + #{ default => "16MB", + desc => "GC the process after how much bytes passed through" })} ];