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 行
This commit is contained in:
@@ -0,0 +1,39 @@
|
||||
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()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user