Files
msgexchange-v2/src/main/kotlin/com/gzzn/omms/msgexchange/config/KafkaD3Check.kt
T
windyboy fc744d0cfd feat(acm2): 闭合 G-KAFKA-D3 / G-IGNORE / G-EVENT-RETENTION 三个缺口
- G-KAFKA-D3:max-in-flight 默认收敛到 1,KafkaD3Check 启动自检钉住三项联合满足 D3
- G-IGNORE:IgnoreRules 在身份绑定后精确匹配 TYPE 字段,命中写 SKIPPED + 回填意图
- G-EVENT-RETENTION:V10 迁移加 SENT_AT 列,投递原子写,EventCleanupJob 有界清理过期 SENT 行
2026-09-13 15:48:16 +08:00

40 lines
1.4 KiB
Kotlin

package com.gzzn.omms.msgexchange.config
import io.micronaut.context.annotation.Context
import io.micronaut.context.annotation.Value
import jakarta.inject.Singleton
/**
* D3 启动自检:Kafka 生产者的 acks / enable-idempotence / max-in-flight 三项
* 必须联合满足幂等生产前提。不满足时拒绝启动——静默放行会让幂等保证在运行时失效。
*
* 独立于 `PipelineLifecycle`(受 autostart 开关控制),无条件执行。
*/
@Singleton
@Context
class KafkaD3Check(
@Value("\${kafka.producers.default.acks}") acks: String,
@Value("\${kafka.producers.default.enable-idempotence}") idempotence: String,
@Value("\${kafka.producers.default.max-in-flight-requests-per-connection}") maxInFlight: String,
) {
private val acks: String = acks
private val idempotence: Boolean = idempotence.toBoolean()
private val maxInFlight: Int = maxInFlight.toInt()
fun validate() {
require(acks == "all" || acks == "-1") {
"D3 violation: kafka.producers.default.acks must be 'all', got '$acks'"
}
require(idempotence) {
"D3 violation: kafka.producers.default.enable-idempotence must be true, got $idempotence"
}
require(maxInFlight == 1) {
"D3 violation: kafka.producers.default.max-in-flight-requests-per-connection must be 1, got $maxInFlight"
}
}
init {
validate()
}
}