Kill Bill 0.24.22 配置参数详解
Kill Bill 0.24.22 配置体系与逐参数详解:三层配置来源与 KB_ 前缀环境变量映射实测验证、启动日志 227 条实测默认值全景(连接池/发票/支付/队列/安全/HTTP 六域)、生产配置模板与生效验证方法。
Kill Bill 0.24.22 配置参数详解
目标:讲清 Kill Bill 0.24.22 的配置体系与逐参数用法——三种配置来源(内置默认值 / 环境变量覆盖 / 属性文件)、官方发行包的参数映射规则、从启动日志提取的 227 条实测默认值全景,以及连接池、发票、支付、队列、安全、HTTP 服务六大核心域的逐参数详解与生产模板,全部默认值取自 Kill Bill 0.24.22 实测环境启动日志逐行照抄。
一、环境信息
- 操作系统:Ubuntu 22.04.4 LTS(内核 6.8.0-138-generic)
- Kill Bill:0.24.22(官方发行包,Compose 编排部署,部署过程见 《Kill Bill 0.24.22 Docker Compose 部署指南》)
- 数据库:killbill/mariadb 0.24(MariaDB 10.x 线)
- 配置取证方式:启动日志参数赋值行 227 条全量提取、进程环境变量实测读取、属性文件与认证配置文件实测查看(2026-10-23)
- JVM:OpenJDK 11(镜像内置),堆实测调优为
-Xms256m -Xmx512m(见部署篇第七节)
二、前置条件
本文逐参数讲解以一份已运行的 Kill Bill 0.24.22 为基础,需要:
- 服务已部署并可访问 API(Swagger 描述文件
http://<IP>:8146/swagger返回 200); - 能在服务器上读取 Kill Bill 进程的日志文件与环境变量(本文演示账号
admin,口令q1w2e3r4;日志文件位于发行包日志目录logs/killbill.out,systemd 托管形态下等价命令为journalctl -u killbill,两种方式回显一致); - 了解 Kill Bill 属性命名规律:所有配置项以
org.killbill.为前缀,按域组织(dao.连接池、invoice.发票、payment.支付、notificationq.队列等)。
三、参数查看与修改方式
3.1 三层配置来源与生效优先级
Kill Bill 0.24.22 实测确认的配置装载顺序(后者覆盖前者):
- 内置默认值:编译在核心代码内,启动日志以
Assigning default value [...]打印; - 外部属性源:环境变量或属性文件,启动日志以
Assigning value [...]打印(区别于 default 字样); - 运行时 API/租户级配置:部分配置(目录、逾期规则、插件配置)存于数据库按租户生效,走 REST API 管理。
判断某参数当前实际值的最可靠手段:grep 启动日志的赋值行。以连接池为例:
grep 'org.killbill.dao.maxActive' logs/killbill.out
实测回显:
Assigning default value [100] for [org.killbill.dao.maxActive] on [org.killbill.commons.jdbi.guice.DaoConfig#getMaxActive()]
default value 字样说明当前生效的是内置默认 100,未被外部覆盖。
3.2 属性文件方式(官方 Tomcat 发行形态)
裸装 Tomcat 的官方部署路径(来源:官方 Getting Started 文档 Tomcat 章节,docs.killbill.io/latest/getting_started.html,查询日期 2026-10-23):把属性追加到 $TOMCAT_HOME/conf/catalina.properties 文件末尾,例如数据源三件套:
org.killbill.dao.url=jdbc:mysql://127.0.0.1:3306/killbill
org.killbill.dao.user=killbill
org.killbill.dao.password=killbill
修改后重启 Tomcat 进程生效。官方发行包内也保留了这个文件的占位形态——发行包内 /var/lib/killbill/killbill.properties 实测内容仅一行注释:
# Placeholder
即官方发行形态默认不依赖属性文件,全部走环境变量(见 3.3),属性文件仅在自行挂载覆盖时使用(挂载方法见部署篇第八节)。
3.3 环境变量方式(Compose/发行包形态,实测重点)
官方发行包支持两类环境变量前缀,实测规则如下:
① 专用变量(镜像启动脚本直接消费):
| 变量 | 作用 | 实测值 |
|---|---|---|
KILLBILL_DAO_URL | 映射为 org.killbill.dao.url | jdbc:mysql://db:3306/killbill |
KILLBILL_DAO_USER | 映射为 org.killbill.dao.user | root |
KILLBILL_DAO_PASSWORD | 映射为 org.killbill.dao.password | killbill |
KILLBILL_CATALOG_URI | 启动预置目录文件名 | SpyCarAdvanced.xml |
KB_ADMIN_PASSWORD | 渲染进认证配置 shiro.ini 的管理员口令 | q1w2e3r4 |
数据源映射的生效证据(启动日志实测,口令自动脱敏为星号):
Assigning value [********] for [org.killbill.dao.password] on [org.killbill.commons.jdbi.guice.DaoConfig#getPassword()]
Assigning value [jdbc:mysql://db:3306/killbill] on [org.killbill.commons.jdbi.guice.DaoConfig#getJdbcUrl()]
② 通用映射变量:任意 org.killbill.* 属性都可用 KB_ 前缀 + 点号转下划线的环境变量覆盖,规则为 org.killbill.jaxrs.threads.pool.nb → KB_org_killbill_jaxrs_threads_pool_nb。
覆盖生效实测(两例,改环境变量重启后日志对照):
# 服务进程环境变量实测读取(进程 PID 以 pgrep 实取)
cat /proc/$(pgrep -f 'catalina.sh run' | head -1)/environ | tr '\0' '\n' | grep KB_org
实测回显:
KB_org_killbill_server_updateCheck_skip=true
KB_org_killbill_jaxrs_threads_pool_nb=23
重启后启动日志对照回显:
Assigning value [23] for [org.killbill.jaxrs.threads.pool.nb] on [org.killbill.billing.util.config.definition.JaxrsConfig#getJaxrsThreadNb()]
Assigning value [true] for [org.killbill.server.updateCheck.skip] on [org.killbill.billing.server.config.UpdateCheckConfig#shouldSkipUpdateCheck()]
对照内置默认值日志(未设置时):
Assigning default value [10] for [org.killbill.jaxrs.threads.pool.nb] on [org.killbill.billing.util.config.definition.JaxrsConfig#getJaxrsThreadNb()]
Assigning default value [false] for [org.killbill.server.updateCheck.skip] on [org.killbill.billing.server.config.UpdateCheckConfig#shouldSkipUpdateCheck()]
Assigning value(非 default)+ 数值变为 23/true,映射规则实测生效。Compose 形态下修改环境变量后需 --force-recreate 重建服务(见部署篇)。
3.4 安全认证文件 shiro.ini
管理员凭据由发行包启动脚本从模板渲染生成:模板 /var/lib/killbill/config/shiro.ini.template 实测内容:
[users]
admin = $KB_ADMIN_PASSWORD, root
[roles]
root = *:*
启动后渲染为实际口令(实测,KB_ADMIN_PASSWORD=q1w2e3r4 时):
[users]
admin = q1w2e3r4, root
[roles]
root = *:*
需要更细的角色权限(如只读运维账号)时挂载自定义 shiro.ini 并同步 org.killbill.security.shiroResourcePath 指向之。口令哈希迭代次数由 org.killbill.security.shiroNbHashIterations 控制(实测默认 200000,见参数总览)。
3.5 运行时级配置(数据库/租户层)
以下配置不走属性体系,运行时按租户存于数据库、经 REST API 管理:定价目录(Catalog XML/JSON 版本化上传)、逾期规则(Overdue XML)、发票模板、插件级配置(经 POST /1.0/kb/tenants/uploadPluginConfig)。属性文件只解决平台级参数,业务级配置见本专栏 API 篇。
四、参数总览
以下参数表全部取自 Kill Bill 0.24.22 实测启动日志(227 条赋值行中按域归纳的核心集,值为实测内置默认值)。查看服务器上实际生效值的统一方法:grep '<参数名>' logs/killbill.out。
4.1 数据源与连接池(org.killbill.dao.*)
| 参数 | 实测默认值 | 说明 |
|---|---|---|
org.killbill.dao.url | 无内置(经 KILLBILL_DAO_URL 注入) | JDBC 连接串 |
org.killbill.dao.user / org.killbill.dao.password | 无内置 | 数据库凭据(日志中口令脱敏为 ********) |
org.killbill.dao.poolingType | HIKARICP | 连接池实现类型 |
org.killbill.dao.maxActive | 100 | 最大连接数 |
org.killbill.dao.minIdle | 1 | 最小空闲连接 |
org.killbill.dao.connectionTimeout | 10s | 获取连接超时 |
org.killbill.dao.idleMaxAge | 60m | 空闲连接最大存活 |
org.killbill.dao.idleConnectionTestPeriod | 5m | 空闲连接检测周期 |
org.killbill.dao.maxConnectionAge | 0m | 连接最大寿命(0=不限) |
org.killbill.dao.leakDetectionThreshold | 60s | 连接泄漏检测阈值 |
org.killbill.dao.transactionIsolationLevel | TRANSACTION_READ_COMMITTED | 事务隔离级别 |
org.killbill.dao.cachePrepStmts | true | 预编译语句缓存开关 |
org.killbill.dao.prepStmtCacheSize | 500 | 预编译缓存条数 |
org.killbill.dao.prepStmtCacheSqlLimit | 2048 | 预编译缓存 SQL 长度上限 |
org.killbill.dao.useServerPrepStmts | true | 服务端预编译开关 |
org.killbill.dao.mysqlServerVersion | 5.1 | 声明的 MySQL 兼容版本(MariaDB 兼容用) |
org.killbill.dao.readOnly | false | 只读模式 |
org.killbill.dao.initializationFailFast | false | 启动时连库失败是否立即终止 |
org.killbill.dao.logLevel | DEBUG | DAO 层 SQL 日志级别 |
org.killbill.dao.healthCheckConnectionTimeout | 10s | 健康检查连库超时 |
org.killbill.dao.healthCheckExpected99thPercentile | 50ms | 健康检查预期 99 分位 |
另有两组同构连接池:org.killbill.billing.main.ro.dao.*(主库只读副本,默认 minIdle=1/maxActive=100)与 org.killbill.billing.osgi.dao.*(插件数据源,默认同),供有读写分离与插件独立数据源的部署使用。
4.2 发票域(org.killbill.invoice.*)
| 参数 | 实测默认值 | 说明 |
|---|---|---|
org.killbill.invoice.enabled | true | 发票系统总开关 |
org.killbill.invoice.maxNumberOfMonthsInFuture | 36 | 未来最多出账月数(防目录错误导致天文账单) |
org.killbill.invoice.maxInvoiceLimit | P200Y | 发票最大回溯周期(ISO-8601) |
org.killbill.invoice.maxDailyNumberOfItemsSafetyBound | 15 | 单账户单日发票条目安全上限 |
org.killbill.invoice.sanitySafetyBoundEnabled | true | 安全上限开关 |
org.killbill.invoice.proration.fixed.days | 0 | 按比例计费的固定天数口径 |
org.killbill.invoice.dryRunNotificationSchedule | 0s | 试算发票通知提前量 |
org.killbill.invoice.parent.commit.local.utc.time | 23:59:59.999 | 汇总账单(父账户)自动提交时点 |
org.killbill.invoice.readMaxRawUsagePreviousPeriod | 2 | 用量回读历史期数 |
org.killbill.invoice.item.result.behavior.mode | AGGREGATE | 发票条目聚合模式 |
org.killbill.invoice.inArrear.mode | DEFAULT | 后付模式 |
org.killbill.invoice.usage.tz.mode | FIXED | 用量计算时区口径模式 |
org.killbill.invoice.disable.usage.zero.amount | false | 零额用量条目是否禁用 |
org.killbill.invoice.usage.missing.lenient | false | 用量缺失时是否宽松处理 |
org.killbill.invoice.parkAccountsOnAllExceptions | true | 出账异常账户自动挂起 |
org.killbill.invoice.parkAccountsWithUnknownUsage | false | 未知用量账户是否挂起 |
org.killbill.invoice.emailNotificationsEnabled | false | 邮件通知开关 |
org.killbill.invoice.globalLock.retries | 50 | 发票全局锁重试次数 |
org.killbill.invoice.plugin | 空 | 外置发票插件名(默认不用) |
4.3 支付域(org.killbill.payment.*)
| 参数 | 实测默认值 | 说明 |
|---|---|---|
org.killbill.payment.plugin.threads.nb | 10 | 支付插件调用线程数 |
org.killbill.payment.plugin.timeout | 30s | 插件调用超时 |
org.killbill.payment.provider.default | __external_payment__ | 默认支付提供方(无网关插件时走外部支付标记) |
org.killbill.payment.retry.days | 8,8,8 | 失败重扣的日间隔计划 |
org.killbill.payment.failure.retry.max.attempts | 8 | 插件失败最大重试次数 |
org.killbill.payment.failure.retry.start.sec | 300 | 失败首次重试间隔(秒) |
org.killbill.payment.failure.retry.multiplier | 2 | 重试间隔倍增因子 |
org.killbill.payment.janitor.rate | 1h | 清账任务(Janitor)运行频率 |
org.killbill.payment.janitor.pending.retries | 1h, 1d | PENDING 交易重试计划 |
org.killbill.payment.janitor.unknown.retries | 5m,1h,1d,1d,1d,1d,1d | UNKNOWN 交易重试计划 |
org.killbill.payment.janitor.attempts.delay | 12h | 重试尝试间隔下限 |
org.killbill.payment.allow.emptyInvoice | false | 是否允许对空发票发起支付 |
org.killbill.payment.method.overwrite | false | 是否允许覆盖默认支付方式 |
org.killbill.payment.globalLock.retries | 50 | 支付全局锁重试次数 |
org.killbill.payment.invoice.plugin | 空 | 支付控制插件链(默认不用) |
4.4 队列与事件总线(notificationq / persistent.bus)
| 参数 | 实测默认值 | 说明 |
|---|---|---|
org.killbill.notificationq.${instanceName}.queue.capacity | 100 | 通知队列内存容量 |
org.killbill.notificationq.${instanceName}.claimed | 10 | 单次认领条数 |
org.killbill.notificationq.${instanceName}.notification.nbThreads | 10 | 通知派发线程数 |
org.killbill.notificationq.${instanceName}.sleep | 3000 | 轮询间隔(毫秒) |
org.killbill.notificationq.${instanceName}.reapThreshold | 10m | 陈旧记录回收阈值 |
org.killbill.notificationq.${instanceName}.max.failure.retry | 3 | 失败最大重试 |
org.killbill.notificationq.${instanceName}.maxReDispatchCount | 10 | 最大重派发数 |
org.killbill.notificationq.${instanceName}.shutdownTimeout | 15s | 关停等待 |
org.killbill.persistent.bus.${instanceName}.queue.capacity | 30000 | 事件总线队列容量 |
org.killbill.persistent.bus.${instanceName}.nbThreads | 30 | 总线派发线程数 |
org.killbill.persistent.bus.${instanceName}.inflight.max | -1 | 并发在途上限(-1 不限) |
💡 说明:
${instanceName}是实例名占位,多节点部署时按实例取值(单节点即默认实例名),实际属性键如org.killbill.notificationq.main.queue.capacity;实例名本身由org.killbill.server.instanceName控制。队列运行模式另有org.killbill.notificationq.main.queue.mode(实测发行包注入为 POLLING,轮询数据库队列)。
4.5 安全与 HTTP 服务(security / jaxrs / server)
| 参数 | 实测默认值 | 说明 |
|---|---|---|
org.killbill.security.shiroNbHashIterations | 200000 | 口令哈希迭代次数 |
org.killbill.security.shiroResourcePath | (发行包注入 /var/lib/killbill/config/shiro.ini) | 认证配置文件路径 |
org.killbill.security.ldap.permissionsByGroup | admin = *:* 等 | LDAP 组权限映射(默认模板) |
org.killbill.jaxrs.threads.pool.nb | 10 | REST API 线程池大小(本文实测覆盖为 23 验证生效) |
org.killbill.server.baseUrl | http://localhost:8080 | 对外基础 URL(Webhook 回调等场景需改为真实地址) |
org.killbill.server.updateCheck.skip | false | 跳过版本更新检查(本文实测覆盖为 true) |
org.killbill.server.updateCheck.url | 官方更新清单地址 | 更新检查数据源 |
org.killbill.server.updateCheck.connectTimeout | 3000 | 更新检查连接超时(毫秒) |
org.killbill.server.shutdownDelay | 0s | 关停延迟 |
org.killbill.overdue.uri | NoOverdueConfig.xml | 逾期规则配置文件名(默认不启用逾期动作) |
org.killbill.catalog.loader.threads.pool.nb | 1 | 目录装载线程数 |
org.killbill.billing.server.event.bulk.subscription.aggregate | false | 批量订阅事件聚合开关 |
五、核心参数分类详解
5.1 连接池调参要点
默认 maxActive=100 对小内存实例偏大:连接池对象本身吃内存,且数据库端连接数是全服务共享资源。4GiB 内存、单实例场景建议 20–30;配合 leakDetectionThreshold=60s 观察日志中是否有泄漏告警。修改示例(Compose 环境变量形态):
environment:
- KB_org_killbill_dao_maxActive=25
重建服务后验证(grep 日志,应见 Assigning value [25] 而非 default 100):
grep 'org.killbill.dao.maxActive' logs/killbill.out
transactionIsolationLevel 默认 TRANSACTION_READ_COMMITTED(读已提交),是账务系统的正确起点——更严格的 REPEATABLE READ 会增加锁冲突,无明确诉求不要上调。
5.2 发票安全边界三件套
maxNumberOfMonthsInFuture=36、maxInvoiceLimit=P200Y、maxDailyNumberOfItemsSafetyBound=15 三个参数构成发票系统的「天文数字账单」防线:目录配置错误(如把月费配成日费)或用量异常放大时,发票引擎会在安全边界内拒绝出账并把账户挂起(parkAccountsOnAllExceptions=true),等待人工处理而非无限出账。零售/小额高频场景可调高 maxDailyNumberOfItemsSafetyBound,企业大额合同场景重点检查 maxNumberOfMonthsInFuture 是否覆盖合同期。
5.3 支付重试节奏
两组重试计划需分清:org.killbill.payment.retry.days=8,8,8 是支付状态机对失败发票的自动重扣节奏(首次失败后第 8/16/24 天再扣,配合逾期状态机在重扣期间推进账户状态);org.killbill.payment.janitor.* 系列是 Janitor 清账任务对 PENDING/UNKNOWN(网关侧状态不明)交易的对账轮询计划。改重试节奏只动前者;Janitor 计划用于网关回调丢失场景的兜底,保持默认即可。
5.4 队列与线程规模
通知队列(notificationq)与事件总线(persistent.bus)默认按中小规模实例配置(派发线程 10/30、队列容量 100/30000、轮询间隔 3 秒)。事件量大的部署(海量订阅变更 Webhook)优先扩 nbThreads 与 queue.capacity;注意轮询模式(POLLING)下事件延迟下限即 sleep=3000 毫秒,对实时性敏感的通知改用插件直推而非调小轮询。
5.5 对外服务与更新检查
org.killbill.server.baseUrl 默认 http://localhost:8080,凡涉及回调地址的通知场景必须改为对外可达地址(如 https://kb.example.com)。updateCheck.skip 默认 false,即每次启动会请求官方更新清单(实测日志可见该请求配置),离线/内网部署建议设为 true(本文已实测验证),消除无关外联。
六、生产配置模板
适用场景:4GiB 内存、NVMe SSD、单实例、月万级订阅的中小规模 SaaS 计费(Compose 环境变量形态,逐项含义见上表):
environment:
- KILLBILL_DAO_URL=jdbc:mysql://db:3306/killbill
- KILLBILL_DAO_USER=root
- KILLBILL_DAO_PASSWORD=killbill
- KB_ADMIN_PASSWORD=q1w2e3r4
- TOMCAT_JAVA_XMS=256m
- TOMCAT_JAVA_XMX=512m
- KB_org_killbill_server_baseUrl=https://kb.example.com
- KB_org_killbill_server_updateCheck_skip=true
- KB_org_killbill_dao_maxActive=25
- KB_org_killbill_dao_leakDetectionThreshold=60s
- KB_org_killbill_jaxrs_threads_pool_nb=20
- KB_org_killbill_payment_plugin_threads_nb=8
- KB_org_killbill_security_shiroNbHashIterations=200000
💡 说明:堆内存 256–512MB 为起步值(官方镜像默认 512m/2G,小内存服务器须下调,修改位置与
jps -v验证方法见部署篇第七节);maxActive=25与 512MB 堆匹配;连接池如报耗尽再按监控逐级上调。每项改后均以「grep 日志赋值行」方式验证生效,方法见 3.1 节。
七、常见问题
Q1:改了参数为什么没生效?
三点排查:外部属性源是否真正注入(cat /proc/<PID>/environ 实测环境变量);属性键名是否拼写正确(通用映射规则 KB_ + 点转下划线,一个都不能错);服务是否真正重建(Compose 下普通 up -d 对「环境变量有变化」会自动重建,但对挂载文件变更不会,需 --force-recreate)。最终以启动日志赋值行为准(Assigning value 出现且值正确才算生效)。
Q2:日志里 default value 和 value 有什么区别?
Assigning default value [X] 表示该参数当前用内置默认值 X(外部未覆盖);Assigning value [Y] 表示有外部属性源注入值 Y。逐行对照即可判断每个参数的生效来源。
Q3:口令在日志里会泄漏吗?
不会明文。实测日志中 org.killbill.dao.password 显示为 ********;但 Compose 编排文件与进程环境变量(/proc/<PID>/environ)中是明文,注意文件权限与服务器访问控制。
Q4:哪些配置不在 properties 体系里?
定价目录、逾期规则、发票模板、插件配置属租户级运行时配置,存数据库、经 REST API 管理(属性文件里只有 org.killbill.overdue.uri、KILLBILL_CATALOG_URI 这类「初始文件指向」);多租户部署时各租户配置相互独立。
Q5:如何确认某个参数存在? 在启动日志 227 条赋值行里 grep 参数关键词即可确认存在性与默认值;日志没有出现的属性名(拼错或该版本不存在)不会有赋值行——这也是甄别「网上流传参数是否适用于 0.24.22」的实测手段。
八、参考链接
- 官方 Getting Started(Tomcat 章节的 catalina.properties 属性追加方式来源):
https://docs.killbill.io/latest/getting_started.html - 官方配置文档(System Properties 目录):
https://killbill.io/docs/ - 本平台同组件文档:《Kill Bill 0.24.22 介绍与选型指南》、《Kill Bill 0.24.22 Docker Compose 部署指南》