fix(syslog-consumer-rule): 解耦统计物化并解决多实例达梦死锁
- 将设备、规则和采集任务业务统计改为专用 Kafka Topic 异步物化 - 使用维度 ID 作为 Kafka key,保证同一统计维度串行更新 - 物化过程读取小型统计表精确值,确保重复消费不会重复计数 - 增加提交后发布、失败重试及定时小表对账补偿 - 固定日统计聚合键写入顺序,完善达梦死锁识别和事务重试 - JSON 解析失败直接转为非标日志,避免进入 DLT 重试链路 - 非标日志使用独立异步队列,不再阻塞正常消息 Kafka ACK - Kafka 升级脚本新增 STATS.MATERIALIZE Topic - 增加统计物化状态指标、配置示例及单元测试
This commit is contained in:
@@ -57,11 +57,11 @@ fi
|
||||
|
||||
echo "新 Topic 使用分区数=${PARTITIONS},副本数=${REPLICAS}"
|
||||
|
||||
SUFFIXES=("RETRY.1M" "RETRY.10M" "RETRY.1H" "DLT" "REPLAY")
|
||||
RETENTIONS=(259200000 604800000 604800000 7776000000 604800000)
|
||||
SUFFIXES=("RETRY.1M" "RETRY.10M" "RETRY.1H" "DLT" "REPLAY" "STATS.MATERIALIZE")
|
||||
RETENTIONS=(259200000 604800000 604800000 7776000000 604800000 604800000)
|
||||
|
||||
echo "[3/4] 创建或更新升级 Topic"
|
||||
for i in 0 1 2 3 4; do
|
||||
for i in 0 1 2 3 4 5; do
|
||||
TOPIC="${RAW_TOPIC}.${SUFFIXES[$i]}"
|
||||
RETENTION_MS="${RETENTIONS[$i]}"
|
||||
|
||||
|
||||
@@ -39,10 +39,10 @@ if [[ ! "${PARTITIONS}" =~ ^[1-9][0-9]*$ ]] || [[ ! "${REPLICAS}" =~ ^[1-9][0-9]
|
||||
exit 1
|
||||
fi
|
||||
|
||||
SUFFIXES=("RETRY.1M" "RETRY.10M" "RETRY.1H" "DLT" "REPLAY")
|
||||
RETENTIONS=(259200000 604800000 604800000 7776000000 604800000)
|
||||
SUFFIXES=("RETRY.1M" "RETRY.10M" "RETRY.1H" "DLT" "REPLAY" "STATS.MATERIALIZE")
|
||||
RETENTIONS=(259200000 604800000 604800000 7776000000 604800000 604800000)
|
||||
|
||||
for i in 0 1 2 3 4; do
|
||||
for i in 0 1 2 3 4 5; do
|
||||
TOPIC="${RAW_TOPIC}.${SUFFIXES[$i]}"
|
||||
echo "创建或确认 Topic:${TOPIC}"
|
||||
"${TOPICS_CMD}" "${COMMON_ARGS[@]}" \
|
||||
|
||||
@@ -162,6 +162,17 @@ services:
|
||||
|
||||
## 发布顺序
|
||||
|
||||
升级 `syslog-consumer-rule` 前,先在 Kafka 集群执行一次
|
||||
`upgrade-doc/v1/kafka/kafka-cluster-upgrade.sh`,确认已经创建:
|
||||
|
||||
```text
|
||||
agent-01-syslog-topic.STATS.MATERIALIZE
|
||||
```
|
||||
|
||||
实际前缀以现场 `spring.kafka.consumer.topic` 为准。统计 Topic 的分区数、副本数会沿用原始 Topic;
|
||||
三个 `syslog-consumer-rule` 实例必须使用相同的 `STATS_MATERIALIZATION_TOPIC` 和
|
||||
`STATS_MATERIALIZATION_GROUP_ID`。
|
||||
|
||||
三个 JAR 一起升级:
|
||||
|
||||
1. `syslog-consumer`
|
||||
@@ -178,6 +189,8 @@ API 任务先执行 validate。先启用告警任务,确认数量、时间和
|
||||
|
||||
- 三个服务启动正常;
|
||||
- Kafka lag 能回到 0,Retry/DLT 没有持续增长;
|
||||
- 统计物化 Topic 没有持续积压,日志持续出现 `统计物化批次完成`;
|
||||
- `/api/syslog/stats/direct/status` 中物化发布、消费、对账均无持续失败;
|
||||
- WAL checkpoint 能追上 durable sequence;
|
||||
- API validate 的配置、DNS、TLS、认证和最小查询全部通过;
|
||||
- API run 中 `recordsFetched` 与 `recordsDurable` 一致,`recordsQuarantined=0`;
|
||||
|
||||
@@ -17,3 +17,14 @@ NORMALIZATION_RULE_SELECTION_AMBIGUOUS_FALLBACK=LOWEST_RULE_ID
|
||||
NORMALIZATION_RULE_SELECTION_DETAIL_LOG_ENABLED=false
|
||||
NORMALIZATION_RULE_SELECTION_EXPLICIT_ENABLED=true
|
||||
NORMALIZATION_RULE_SELECTION_AUTOMATIC_FALLBACK_ENABLED=true
|
||||
|
||||
# 统计投影解耦:三个 syslog-consumer-rule 实例保持完全相同的 Topic 与 Group ID。
|
||||
STATS_MATERIALIZATION_ENABLED=true
|
||||
STATS_MATERIALIZATION_TOPIC=agent-01-syslog-topic.STATS.MATERIALIZE
|
||||
STATS_MATERIALIZATION_GROUP_ID=agent-01-syslog-group-stats-materialize
|
||||
STATS_MATERIALIZATION_LISTENER_CONCURRENCY=1
|
||||
STATS_MATERIALIZATION_PUBLISH_INTERVAL_MS=200
|
||||
STATS_MATERIALIZATION_PUBLISH_MAX_BATCH_SIZE=1000
|
||||
STATS_MATERIALIZATION_MAX_CONCURRENCY_RETRIES=3
|
||||
STATS_MATERIALIZATION_CONCURRENCY_RETRY_BACKOFF_MS=50
|
||||
STATS_MATERIALIZATION_RECONCILE_INTERVAL_MS=60000
|
||||
|
||||
Reference in New Issue
Block a user