Apache BifroMQ 3.3.5 配置参数详解

Apache BifroMQ 3.3.5 配置参数详解:梳理 standalone.yml 主配置、启动环境变量、运行时 Setting 动态参数、系统属性与生产模板,默认值取自启动日志全量 dump,一手实测

Apache BifroMQBifroMQ2026/10/13

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)
port0(自动分配)成员消息监听端口;seed 节点建议显式固定端口
seedEndpointsnull加入已有集群的种子地址表,格式 <ADDRESS>:<PORT>,...;首个引导节点留空
clusterDomainNamenull通过 DNS 解析发现成员的可选域名

💡 单机模式无需改动本节;bootstrap: true + 空 seedEndpoints 即自引导单节点集群(内置 basekv 存储以单副本运行)。

4.3 MQTT 服务配置(mqttServerConfig)

实测整合值(12 核机器):

参数默认值说明
connTimeoutSec20连接握手超时(秒)
maxConnPerSec2000每秒新建连接上限
maxDisconnPerSec1000每秒断开上限
maxMsgByteSize262144(256KB)单条消息字节上限
maxConnBandwidth524288单连接带宽(字节/秒)
defaultKeepAliveSec300客户端未带 keep-alive 时的默认值
bossELGThreads1网络 boss 线程
workerELGThreads6网络 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)

参数实测默认说明
enabletrueHTTP API 总开关
hostsite-local 地址(实测 172.17.0.3)绑定地址;想本机 127.0.0.1 可访问需显式改为 0.0.0.0 或 127.0.0.1
httpPort8091HTTP API 端口
maxContentLength262144请求体上限(字节)
apiBossThreads / apiWorkerThreads1 / 2API 服务线程
httpsListenerConfigenable: false, port: 8090HTTPS 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
baseKVClientConfigworkerThreads: 2内置 KV 存储客户端
baseKVServerConfigworkerThreads: 6,端口 0内置 KV 存储服务端
stateStoreConfig.distWorkerConfig数据/WAL 均为 rocksdb 引擎订阅匹配存储
inboxStoreConfiggcIntervalSeconds: 600,rocksdb会话(inbox)存储,含 balanceConfig 副本/分裂均衡器
retainStoreConfiggcIntervalSeconds: 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_OPTSZGC 全套:-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 / MQTT5Enabledtrue / true / true各协议版本开关
MaximumQoS2允许的最大 QoS
MaxTopicLength / MaxTopicLevels / MaxTopicLevelLength255 / 16 / 40主题长度与层级限制
MaxTopicAlias10MQTT5 主题别名上限
MaxTopicFiltersPerSub / MaxTopicFiltersPerInbox10 / 100单次订阅与单会话订阅数上限
MaxSharedGroupMembers200共享订阅组成员上限
WildcardSubscriptionEnabledtrue通配符订阅开关
SharedSubscriptionEnabledtrue共享订阅开关
RetainEnabledtrue保留消息开关
MsgPubPerSec200单会话每秒发布数限流
InBoundBandWidth / OutBoundBandWidth524288单会话出入带宽(字节/秒)
MaxUserPayloadBytes262144单条消息负载上限
SessionInboxSize1000离线会话队列长度
QoS0DropOldestfalseinbox 满时 QoS0 淘汰策略
MaxSessionExpirySeconds86400会话过期上限(秒)
MaxResendTimes / ResendTimeoutSeconds3 / 10QoS1/2 重传策略
ReceivingMaximum200服务端接收窗口
ForceTransientfalse强制所有会话按瞬态处理

覆盖示例(追加到 EXTRA_JVM_OPTS 或 systemd 环境变量):

EXTRA_JVM_OPTS="-DMaximumQoS=1 -DMaxUserPayloadBytes=65536 -DMsgPubPerSec=50"

七、系统属性(内部引擎调优,-D)

info.log 中「BifroMQ system properties」段全量 dump,核心项(实测值):

属性默认说明
ingress_slowdown_heap_memory_usage0.9堆内存占用超 90% 触发入口限速
ingress_slowdown_direct_memory_usage0.8堆外内存限速阈值
max_slowdown_timeout_seconds5限速最长等待(秒)
mqtt_utf8_sanity_checkfalse主题 UTF-8 严格校验
dist_worker_range_voter_count3dist worker range 副本票数
dist_worker_topic_match_expiry_seconds60主题匹配缓存过期
dist_worker_max_cached_subs_per_tenant200000租户订阅缓存上限
dist_worker_fanout_split_threshold100000fanout 分裂阈值
dist_server_dist_worker_call_queues12dist server 调用队列
mqtt_deliverers_per_server12每服务投递线程
inbox_deliverers100inbox 投递线程
session_register_num1000会话批量注册粒度
inbox_store_range_voter_count / retain_store_range_voter_count1 / 3各存储 range 票数
control_plane_tolerant_latency_ms / control_plane_burst_latency_ms2000 / 5000控制面延迟阈值
data_plane_tolerable_latency_ms / data_plane_burst_latency_ms1000 / 5000数据面延迟阈值
cluster_domain_resolve_timeout_seconds120集群域名解析超时
max_mqtt3_client_id_length / max_mqtt5_client_id_length65535客户端 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 节点务必固定端口)。

十、参考链接