Apache BifroMQ 3.3.5 配置参数详解
Apache BifroMQ 3.3.5 配置参数详解:梳理 standalone.yml 主配置、启动环境变量、运行时 Setting 动态参数、系统属性与生产模板,默认值取自启动日志全量 dump,一手实测
Apache BifroMQ 3.3.5 配置参数详解
目标:系统梳理 Apache BifroMQ 3.3.5 单机版的全部配置入口与参数:
conf/standalone.yml(主配置)、启动脚本环境变量(堆与 JVM)、运行时 Setting(租户级动态参数)、系统属性(内部引擎调优),并给出生产模板与常见问题。所有默认值均取自实测环境(Ubuntu 22.04.5 + OpenJDK 17.0.20.1 + 3.3.5 standalone)启动时自动 dump 到logs/info.log的「Consolidated Config(YAML)」与「BifroMQ system properties」,为一手数据。
一、环境信息
- 操作系统:Ubuntu 22.04.5 LTS(x86_64),12 核,31GB 内存
- Apache BifroMQ:3.3.5(standalone 发行包)
- Java:OpenJDK 17.0.20.1
- 配置文件:
/usr/share/bifromq/conf/standalone.yml - 观察手段:
logs/info.log启动时全量 dump 整合配置(服务进程启动后合并了默认值与用户覆盖值的最终生效结果),是核对配置是否生效的第一手依据
二、前置条件
- 已按《Apache BifroMQ 3.3.5 安装指南》完成安装并能正常启动
- 了解 YAML 基本语法;修改配置后需重启进程生效(
./bin/standalone.sh restart或systemctl restart bifromq)
三、参数查看与修改方式
| 层 | 入口 | 生效方式 | 典型用途 |
|---|---|---|---|
| 主配置 | conf/standalone.yml | 重启进程 | 端口、集群、插件、存储引擎 |
| 启动环境变量 | MEM_LIMIT、JVM_HEAP_OPTS、JVM_GC_OPTS、JVM_PERF_OPTS、EXTRA_JVM_OPTS、LOG_DIR、DATA_DIR、JAVA_HOME、JVM_DEBUG | 重启进程 | 堆大小、GC、目录、远程调试 |
| 运行时 Setting(租户级) | -D<Setting名>=<值>(JVM 参数) | 重启进程 | MQTT 行为限制(QoS 上限、包长、会话数等) |
| 系统属性(内部调优) | -D<属性名>=<值>(JVM 参数) | 重启进程 | dist/inbox/retain 引擎线程与分裂策略等 |
| 日志 | conf/logback.xml | 重启进程 | 日志级别与输出 |
| 生效核对 | logs/info.log 启动时 dump | — | 「Consolidated Config(YAML)」「Setting:」「BifroMQSysProp:」三段全量清单 |
💡 官方明示:
standalone.yml中只需写要覆盖默认值的项,未写的项使用内置默认;最终生效值以 info.log 的整合 dump 为准。3.3.x 各版本间配置项可能变化,升级时以 dump 为基准比对。
四、standalone.yml 主配置详解
4.1 服务引导与插件(文件级参数)
出厂文件(注释态)与实测整合值对照:
# 是否负责集群引导;3.3.0 起已废弃(deprecated),保留兼容
bootstrap: true
# 自定义鉴权提供器(实现 IAuthProvider 的插件类 FQN)
# 不配置时使用 DEV ONLY 演示实现
authProviderFQN: "com.baidu.demo.plugin.AllowAllAuthProvider" # 出厂注释态
resourceThrottlerFQN: null # 租户级资源限流提供器,null 用 DEV ONLY
settingProviderFQN: null # 租户级动态设置提供器,null 用 DEV ONLY
说明:
authProviderFQN:接入自建鉴权(认证 + PUB/SUB 授权)的入口。自带 demo 插件提供了基于 webhook 的演示实现com.baidu.demo.plugin.DemoAuthProvider,需配合启动参数-Dplugin.authprovider.url=http://<webhook地址>/提供回调(/auth、/check、/register);未配置 webhook 时其兜底行为是拒绝所有检查请求。- 三个 FQN 均通过 pf4j 扩展点解析:实现类必须位于
plugins/下插件 jar 内,并以@Extension注解注册(插件 jar 的META-INF/extensions.idx中列有实现类全名)。
4.2 集群配置(clusterConfig)
| 参数 | 实测默认 | 说明 |
|---|---|---|
env | "Test" | 集群环境标识,同 env 的成员才能互相发现通信;生产建议改为业务名 |
host | 空 → 自动取 site-local 地址 | 成员间通信绑定地址(实测解析为 172.17.0.3) |
port | 0(自动分配) | 成员消息监听端口;seed 节点建议显式固定端口 |
seedEndpoints | null | 加入已有集群的种子地址表,格式 <ADDRESS>:<PORT>,...;首个引导节点留空 |
clusterDomainName | null | 通过 DNS 解析发现成员的可选域名 |
💡 单机模式无需改动本节;
bootstrap: true+ 空seedEndpoints即自引导单节点集群(内置 basekv 存储以单副本运行)。
4.3 MQTT 服务配置(mqttServerConfig)
实测整合值(12 核机器):
| 参数 | 默认值 | 说明 |
|---|---|---|
connTimeoutSec | 20 | 连接握手超时(秒) |
maxConnPerSec | 2000 | 每秒新建连接上限 |
maxDisconnPerSec | 1000 | 每秒断开上限 |
maxMsgByteSize | 262144(256KB) | 单条消息字节上限 |
maxConnBandwidth | 524288 | 单连接带宽(字节/秒) |
defaultKeepAliveSec | 300 | 客户端未带 keep-alive 时的默认值 |
bossELGThreads | 1 | 网络 boss 线程 |
workerELGThreads | 6 | 网络 worker 线程(默认 max(核数/2, 2),12 核→6) |
4.4 四类监听器
tcpListener: # MQTT over TCP
enable: true
host: "0.0.0.0"
port: 1883
tlsListener: # MQTT over TLS
enable: false # 默认关闭
host: "0.0.0.0"
port: 1884
sslConfig: null # 开启时需配 keystore/truststore
wsListener: # MQTT over WebSocket
enable: true
host: "0.0.0.0"
port: 8080
wsPath: "/mqtt"
wssListener: # MQTT over WSS
enable: false # 默认关闭
host: "0.0.0.0"
port: 8443
wsPath: "/mqtt"
sslConfig: null
实测要点:tcpListener.host 整合值为 0.0.0.0(全网卡监听);8080 的 WebSocket 路径固定为 /mqtt。
4.5 管理 API(apiServerConfig)
| 参数 | 实测默认 | 说明 |
|---|---|---|
enable | true | HTTP API 总开关 |
host | site-local 地址(实测 172.17.0.3) | 绑定地址;想本机 127.0.0.1 可访问需显式改为 0.0.0.0 或 127.0.0.1 |
httpPort | 8091 | HTTP API 端口 |
maxContentLength | 262144 | 请求体上限(字节) |
apiBossThreads / apiWorkerThreads | 1 / 2 | API 服务线程 |
httpsListenerConfig | enable: false, port: 8090 | HTTPS API,默认关 |
接口清单(参数走 HTTP Header,非 JSON body):POST /pub、POST /retain、GET /session、DELETE /session、DELETE /kill、PUT /sub、DELETE /unsub。
4.6 内部 RPC 与存储(一般无需改动)
| 段 | 关键默认值 | 说明 |
|---|---|---|
rpcClientConfig / rpcServerConfig | 端口 0 自动分配,SSL 关 | 内部节点间 RPC |
baseKVClientConfig | workerThreads: 2 | 内置 KV 存储客户端 |
baseKVServerConfig | workerThreads: 6,端口 0 | 内置 KV 存储服务端 |
stateStoreConfig.distWorkerConfig | 数据/WAL 均为 rocksdb 引擎 | 订阅匹配存储 |
inboxStoreConfig | gcIntervalSeconds: 600,rocksdb | 会话(inbox)存储,含 balanceConfig 副本/分裂均衡器 |
retainStoreConfig | gcIntervalSeconds: 600,rocksdb | 保留消息存储 |
| 数据目录 | dataPathRoot: "" → 进程数据目录 | 引擎落盘位置 |
各 store 通用引擎参数:manualCompaction、compactMinTombstoneKeys(200000)、compactMinTombstoneRanges(100000)、compactTombstoneRatio(0.3)、asyncWALFlush: true、fsyncWAL: false。
五、启动脚本环境变量(JVM 与目录)
实读 bin/bifromq-start.sh 归纳:
| 变量 | 默认行为 | 覆盖示例 |
|---|---|---|
JVM_HEAP_OPTS | 不设则按总内存 70% 推导 Xmx、其一半 Xms;Metaspace 128m/500m;DirectMemory=总内存 20% | -Xms256m -Xmx512m(实测 jps -v 可见) |
MEM_LIMIT | 不设则读 /proc/meminfo 总内存 | 536870912(512MB,实测推导 -Xms179m -Xmx358m);优先级高于本机总内存 |
JVM_GC_OPTS | ZGC 全套:-XX:+UseZGC -XX:ZAllocationSpikeTolerance=5 -Xlog:async,OOM 时 Crash + HeapDump | 换 G1 等需整段覆盖 |
JVM_PERF_OPTS | -server -XX:MaxInlineLevel=15 -Djava.awt.headless=true | 一般不动 |
EXTRA_JVM_OPTS | 追加 -Dio.netty.tryReflectionSetAccessible=true -Dio.netty.allocator.cacheTrimIntervalMillis=5000 --add-opens java.base/java.nio=ALL-UNNAMED | 追加系统属性(含 Setting 覆盖) |
LOG_DIR / DATA_DIR | <安装目录>/logs、/data | 自定义目录 |
JAVA_HOME | 用 PATH 里的 java | /usr/lib/jvm/java-17-openjdk-amd64 |
JVM_DEBUG + JAVA_DEBUG_PORT | 关闭 | true + 8008 开远程调试 |
⚠️ 堆推导的优先级:显式
JVM_HEAP_OPTS>MEM_LIMIT推导 > 本机总内存推导。31GB 内存的机器默认会拿 22GB 堆(实测 -Xms11217m -Xmx22435m),小规格务必显式约束。
六、运行时 Setting(租户级动态参数)
启动时全量 dump 在 info.log(Setting: <名>=<值>),可用 -D<名>=<值> 覆盖默认值。常用项(实测值):
| Setting | 默认 | 说明 |
|---|---|---|
| MQTT3Enabled / MQTT4Enabled / MQTT5Enabled | true / true / true | 各协议版本开关 |
| MaximumQoS | 2 | 允许的最大 QoS |
| MaxTopicLength / MaxTopicLevels / MaxTopicLevelLength | 255 / 16 / 40 | 主题长度与层级限制 |
| MaxTopicAlias | 10 | MQTT5 主题别名上限 |
| MaxTopicFiltersPerSub / MaxTopicFiltersPerInbox | 10 / 100 | 单次订阅与单会话订阅数上限 |
| MaxSharedGroupMembers | 200 | 共享订阅组成员上限 |
| WildcardSubscriptionEnabled | true | 通配符订阅开关 |
| SharedSubscriptionEnabled | true | 共享订阅开关 |
| RetainEnabled | true | 保留消息开关 |
| MsgPubPerSec | 200 | 单会话每秒发布数限流 |
| InBoundBandWidth / OutBoundBandWidth | 524288 | 单会话出入带宽(字节/秒) |
| MaxUserPayloadBytes | 262144 | 单条消息负载上限 |
| SessionInboxSize | 1000 | 离线会话队列长度 |
| QoS0DropOldest | false | inbox 满时 QoS0 淘汰策略 |
| MaxSessionExpirySeconds | 86400 | 会话过期上限(秒) |
| MaxResendTimes / ResendTimeoutSeconds | 3 / 10 | QoS1/2 重传策略 |
| ReceivingMaximum | 200 | 服务端接收窗口 |
| ForceTransient | false | 强制所有会话按瞬态处理 |
覆盖示例(追加到 EXTRA_JVM_OPTS 或 systemd 环境变量):
EXTRA_JVM_OPTS="-DMaximumQoS=1 -DMaxUserPayloadBytes=65536 -DMsgPubPerSec=50"
七、系统属性(内部引擎调优,-D)
info.log 中「BifroMQ system properties」段全量 dump,核心项(实测值):
| 属性 | 默认 | 说明 |
|---|---|---|
ingress_slowdown_heap_memory_usage | 0.9 | 堆内存占用超 90% 触发入口限速 |
ingress_slowdown_direct_memory_usage | 0.8 | 堆外内存限速阈值 |
max_slowdown_timeout_seconds | 5 | 限速最长等待(秒) |
mqtt_utf8_sanity_check | false | 主题 UTF-8 严格校验 |
dist_worker_range_voter_count | 3 | dist worker range 副本票数 |
dist_worker_topic_match_expiry_seconds | 60 | 主题匹配缓存过期 |
dist_worker_max_cached_subs_per_tenant | 200000 | 租户订阅缓存上限 |
dist_worker_fanout_split_threshold | 100000 | fanout 分裂阈值 |
dist_server_dist_worker_call_queues | 12 | dist server 调用队列 |
mqtt_deliverers_per_server | 12 | 每服务投递线程 |
inbox_deliverers | 100 | inbox 投递线程 |
session_register_num | 1000 | 会话批量注册粒度 |
inbox_store_range_voter_count / retain_store_range_voter_count | 1 / 3 | 各存储 range 票数 |
control_plane_tolerant_latency_ms / control_plane_burst_latency_ms | 2000 / 5000 | 控制面延迟阈值 |
data_plane_tolerable_latency_ms / data_plane_burst_latency_ms | 1000 / 5000 | 数据面延迟阈值 |
cluster_domain_resolve_timeout_seconds | 120 | 集群域名解析超时 |
max_mqtt3_client_id_length / max_mqtt5_client_id_length | 65535 | 客户端 ID 长度上限 |
八、生产配置模板
conf/standalone.yml(按需裁剪):
mqttServerConfig:
connTimeoutSec: 20
maxMsgByteSize: 1048576 # 放宽到 1MB,按业务定
defaultKeepAliveSec: 120
tcpListener:
enable: true
host: "0.0.0.0"
port: 1883
# 生产建议启用 TLS
# tlsListener:
# enable: true
# port: 8883
# sslConfig: { keystorePath: /etc/bifromq/server.p12, keystorePassword: "***" }
clusterConfig:
env: "PROD" # 与其他环境隔离
host: 192.168.1.11 # 显式指定本机地址
port: 11000 # seed 节点固定端口
# 多节点时在其余节点配置:
# seedEndpoints: "192.168.1.11:11000"
apiServerConfig:
enable: true
host: "0.0.0.0" # 允许 127.0.0.1 访问
httpPort: 8091
# httpsListenerConfig:
# enable: true
# port: 8090
# 生产接入自建鉴权插件
authProviderFQN: "com.example.bifromq.plugin.MyAuthProvider"
配套 systemd(堆 256-512MB):
[Service]
Environment="JVM_HEAP_OPTS=-Xms256m -Xmx512m"
Environment="EXTRA_JVM_OPTS=-DMaximumQoS=1 -Dingress_slowdown_heap_memory_usage=0.85"
九、常见问题
9.1 改了 standalone.yml 不生效
- 是否重启进程(该文件不支持热加载);
- YAML 层级/缩进是否正确(如
mqttServerConfig.tcpListener.port是两层嵌套); - 以 info.log 中「Consolidated Config(YAML)」dump 为准核对生效值,dump 里是什么就是什么。
9.2 8091 用 127.0.0.1 访问不通
apiServerConfig.host 默认取 site-local 地址。改 host: "0.0.0.0" 重启即可。
9.3 堆参数与预期不符
- 确认没有同时设置
JVM_HEAP_OPTS和MEM_LIMIT造成理解混淆(前者精确、后者推导); - systemd 下
Environment=值含空格必须整体加双引号,否则空格后内容被丢弃(实测 jps -v 只剩 -Xms); - 核对手段:
jps -v | grep StandaloneStarter。
9.4 Setting 覆盖不生效
Setting 是 JVM 系统属性,要放在 -D 后(如 -DMaximumQoS=1),且随启动参数传入;检查 info.log 的 Setting: dump 段确认。
9.5 集群组不起来
env不一致(必须完全相同);seedEndpoints格式错误(应为IP:PORT逗号分隔,指向已固定port的种子节点);- 防火墙未放行
clusterConfig.port与内部 RPC 端口(自动分配模式下重启会变,seed 节点务必固定端口)。