- G-KAFKA-D3:max-in-flight 默认收敛到 1,KafkaD3Check 启动自检钉住三项联合满足 D3 - G-IGNORE:IgnoreRules 在身份绑定后精确匹配 TYPE 字段,命中写 SKIPPED + 回填意图 - G-EVENT-RETENTION:V10 迁移加 SENT_AT 列,投递原子写,EventCleanupJob 有界清理过期 SENT 行
40 lines
1.4 KiB
Kotlin
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()
|
|
}
|
|
}
|