feat: scaffold Micronaut+Kotlin service per ACMA-8 v4 architecture
- 4 modules (ingress/processing/delivery/reference) + codec + infra + jobs - Flyway V2.0.0: six aux tables (PROC_STATE/MSG_EVENT/REF_DATA/REQ_TRACK/PUMP_JOB/FLIGHT_STATE) - Lua: snapshot_replace (atomic cover+gen-diff-delete), batch_delete (3:30 sweep) - config: env-externalized secrets, phase A/B switch, ACMA-8 param-table defaults - logback: logstash TCP JSON + traceId MDC - pure-logic tests: identity (I3), schd aggregation max-by-EVENT_ID (FIX #7) - build verified: gradle compile+test green on JDK 25 (Micronaut 5.1 requires JVM 25+) Migrated from legacy repo subdirectory per repo-strategy decision (separate repo per service, org convention). Refs: ACMA-9, ACMA-8 v4, ACMA-6
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
# =====================================================================
|
||||
# msgexchange-nextgen 配置(ACMA-8 v4)
|
||||
# 口令/端点全部环境变量外置——零入库(ACMA-8 契约冻结 + 安全基线)
|
||||
# =====================================================================
|
||||
msgx:
|
||||
phase: A # A=Redis 权威(主泵单线程写,I5);B=FLIGHT_STATE 权威+投影
|
||||
service-name: msgexchangeapi # 契约冻结;影子实例用 msgexchangeapi-shadow + 独立表/key前缀/topic
|
||||
register-eureka: true # 影子对拍期置 false 或独立服务名
|
||||
pipeline: # —— ACMA-8 参数表初值(阶段 0 基线校准)——
|
||||
poll-interval: 1s # KEEP 现役 1s 轮询节奏
|
||||
claim-batch: 50
|
||||
max-attempts: 5 # 处理/投递同值
|
||||
backoff-ms: [1000, 2000, 4000, 8000, 16000] # 指数退避,单次封顶 60s
|
||||
backoff-cap-ms: 60000
|
||||
head-deadline: 10m # 队头滞留上界 = 最坏 HOL 时长(毒丸升级)
|
||||
schd:
|
||||
flush-period: 3s # KEEP 现役推送节律
|
||||
flush-limit: 500 # 批上限,防积压尖峰
|
||||
identity:
|
||||
include-day-boundary: false # CONFIRM(矩阵 #11):SEQN 重置作用域确认前保持关闭
|
||||
consistency-check: # 阶段 A 唯一主动一致性哨兵(必选)
|
||||
on-startup: true
|
||||
daily-sample-ratio: 0.01
|
||||
|
||||
micronaut:
|
||||
application:
|
||||
name: msgexchange-nextgen
|
||||
server:
|
||||
port: 8080
|
||||
|
||||
datasource:
|
||||
url: ${MSGX_DB_URL}
|
||||
username: ${MSGX_DB_USER}
|
||||
password: ${MSGX_DB_PASSWORD}
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
|
||||
flyway:
|
||||
enabled: true
|
||||
locations: classpath:db/migration
|
||||
|
||||
redis:
|
||||
uri: ${MSGX_REDIS_URI} # 阶段 A 权威存储;仅主泵线程写(I5)
|
||||
|
||||
kafka:
|
||||
bootstrap:
|
||||
servers: ${MSGX_KAFKA_SERVERS}
|
||||
producers:
|
||||
acks: all
|
||||
enable-idempotence: true
|
||||
|
||||
eureka:
|
||||
client:
|
||||
registration:
|
||||
enabled: ${msgx.register-eureka}
|
||||
default-zone: ${MSGX_EUREKA_URL:http://127.0.0.1:8761/eureka}
|
||||
|
||||
# logstash TCP JSON 通道保留(字段兼容现网,ACMA-3 部署前提)——见 logback.xml
|
||||
logstash:
|
||||
host: ${MSGX_LOGSTASH_HOST:127.0.0.1}
|
||||
port: ${MSGX_LOGSTASH_PORT:5044}
|
||||
@@ -0,0 +1,78 @@
|
||||
-- =====================================================================
|
||||
-- ACMA-8 v4 数据模型(六表)· Flyway 基线迁移
|
||||
-- 与 issue「综合架构设计」数据模型节逐字一致;影子实例在独立 schema 执行同一脚本。
|
||||
-- =====================================================================
|
||||
|
||||
-- ① 处理状态伴生表(不动 CMINMSGS 旧列;
|
||||
-- 回滚兼容:SUCCEEDED 时回填 CMINMSGS.DATE_PROCESSED/STATUS,旧系统可接管续跑)
|
||||
CREATE TABLE PROC_STATE (
|
||||
CMINMSGS_ID BIGINT PRIMARY KEY,
|
||||
STATE VARCHAR(16) NOT NULL, -- PENDING/FAILED/SUCCEEDED/SKIPPED/DEAD
|
||||
IDENTITY_KEY VARCHAR(200) NULL, -- SNDR|TYPE|STYP|SEQN,decode 后首次绑定(I3)
|
||||
ATTEMPTS INT NOT NULL DEFAULT 0,
|
||||
NEXT_ATTEMPT_AT TIMESTAMP NULL,
|
||||
ERROR_CLASS VARCHAR(20) NULL, -- MALFORMED/CODEC_ERROR/EXHAUSTED/INFRA
|
||||
LAST_ERROR VARCHAR(1000) NULL,
|
||||
UPDATED_AT TIMESTAMP NOT NULL,
|
||||
UNIQUE KEY UK_PROC_IDENTITY (IDENTITY_KEY),
|
||||
INDEX IDX_PROC_HEAD (STATE, CMINMSGS_ID) -- 主泵队头查询(I1)
|
||||
);
|
||||
|
||||
-- ② 统一投递事件(outbox)
|
||||
CREATE TABLE MSG_EVENT (
|
||||
EVENT_ID BIGINT AUTO_INCREMENT PRIMARY KEY,
|
||||
TARGET VARCHAR(30) NOT NULL, -- KAFKA:msg / KAFKA:schd(A起);ES:flight_hts / REDIS:flightInfo(B起)
|
||||
PARTITION_KEY VARCHAR(64) NULL, -- schd 事件恒为 FLID
|
||||
PAYLOAD_JSON MEDIUMTEXT NOT NULL,
|
||||
STATE VARCHAR(16) NOT NULL, -- PENDING/SENT/DEAD
|
||||
ATTEMPTS INT NOT NULL DEFAULT 0,
|
||||
NEXT_ATTEMPT_AT TIMESTAMP NULL,
|
||||
ERROR_CLASS VARCHAR(20) NULL,
|
||||
LAST_ERROR VARCHAR(1000) NULL,
|
||||
CREATED_AT TIMESTAMP NOT NULL,
|
||||
INDEX IDX_EVT_HEAD (TARGET, STATE, EVENT_ID) -- 每 target 队头查询(I1 双层同策略)
|
||||
);
|
||||
|
||||
-- ③ 参考数据 + SCHD generation 元数据(21 类;SCHD_GEN 行 RKEY=日期)
|
||||
CREATE TABLE REF_DATA (
|
||||
RTYPE VARCHAR(20) NOT NULL, -- AIRL/ARPT/... | SCHD_GEN
|
||||
RKEY VARCHAR(64) NOT NULL,
|
||||
PAYLOAD_JSON MEDIUMTEXT NOT NULL, -- SCHD_GEN: {"flids":[...],"version":N}
|
||||
VERSION BIGINT NOT NULL DEFAULT 0, -- putGenIfVersion CAS 依据(流程 4)
|
||||
SOURCE VARCHAR(20) NOT NULL, -- ADMINAPI / AODB / PIPELINE
|
||||
REFRESHED_AT TIMESTAMP NOT NULL,
|
||||
PRIMARY KEY (RTYPE, RKEY)
|
||||
);
|
||||
|
||||
-- ④ 请求状态机(15 类,流程 6)
|
||||
CREATE TABLE REQ_TRACK (
|
||||
REQ_ID BIGINT AUTO_INCREMENT PRIMARY KEY,
|
||||
REQ_TYPE VARCHAR(20) NOT NULL,
|
||||
PARAMS_JSON VARCHAR(500) NOT NULL,
|
||||
STATE VARCHAR(16) NOT NULL, -- REGISTERED/SENT/WAITING/DONE/EXPIRED
|
||||
COUTMSGS_ID INT NULL,
|
||||
SENT_AT TIMESTAMP NULL,
|
||||
COMPLETED_AT TIMESTAMP NULL,
|
||||
INDEX IDX_REQ_OPEN (REQ_TYPE, STATE)
|
||||
);
|
||||
|
||||
-- ⑤ 泵作业队列(定时任务统一入口:cron 触发入队,主泵 FIFO 执行)
|
||||
CREATE TABLE PUMP_JOB (
|
||||
JOB_ID BIGINT AUTO_INCREMENT PRIMARY KEY,
|
||||
KIND VARCHAR(20) NOT NULL, -- ARCHIVE / HISTORY_SWEEP / PROJECTION_REBUILD
|
||||
STATE VARCHAR(16) NOT NULL, -- QUEUED/RUNNING/DONE/FAILED
|
||||
CREATED_AT TIMESTAMP NOT NULL,
|
||||
UPDATED_AT TIMESTAMP NOT NULL,
|
||||
LAST_ERROR VARCHAR(1000) NULL
|
||||
);
|
||||
|
||||
-- ⑥ 航班状态权威(阶段 B 启用;此前 Redis 为权威,I5)
|
||||
CREATE TABLE FLIGHT_STATE (
|
||||
FLID VARCHAR(32) PRIMARY KEY,
|
||||
FDAY DATE NOT NULL,
|
||||
VERSION BIGINT NOT NULL,
|
||||
MAID VARCHAR(32) NULL,
|
||||
PAYLOAD_JSON MEDIUMTEXT NOT NULL, -- 投影兼容格式的 FLTR JSON
|
||||
UPDATED_AT TIMESTAMP NOT NULL,
|
||||
INDEX IDX_FS_DAY (FDAY, VERSION)
|
||||
);
|
||||
@@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- ACMA-8/ACMA-6:logstash TCP JSON 通道保留(字段兼容现网)+ MDC traceId -->
|
||||
<configuration>
|
||||
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<encoder>
|
||||
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level [%X{traceId:-}] %logger{36} - %msg%n</pattern>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
|
||||
<destination>${LOGSTASH_HOST:-127.0.0.1}:${LOGSTASH_PORT:-5044}</destination>
|
||||
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
|
||||
<includeMdcKeyName>traceId</includeMdcKeyName>
|
||||
</encoder>
|
||||
<reconnectionDelay>10 seconds</reconnectionDelay>
|
||||
</appender>
|
||||
|
||||
<root level="INFO">
|
||||
<appender-ref ref="STDOUT"/>
|
||||
<appender-ref ref="LOGSTASH"/>
|
||||
</root>
|
||||
|
||||
<logger name="com.gzzn.omms.msgexchange.nextgen" level="DEBUG"/>
|
||||
</configuration>
|
||||
@@ -0,0 +1,9 @@
|
||||
-- ACMA-8 流程 4(runJob HISTORY_SWEEP)/ I4:3:30 清场批量删除。
|
||||
-- 仅删除“ES 归档成功集”(调用方以 saveSync 成功返回集为参),同一泵线程程序序保证依赖。
|
||||
-- KEYS[1] = flightInfo;ARGV = 待删除 FLID 列表
|
||||
local n = 0
|
||||
for i = 1, #ARGV do
|
||||
redis.call('HDEL', KEYS[1], ARGV[i])
|
||||
n = n + 1
|
||||
end
|
||||
return n
|
||||
@@ -0,0 +1,19 @@
|
||||
-- ACMA-8 流程 4 / I4 / I5:日计划快照“覆盖新代 + 按代差删”,同一 hash 原子执行。
|
||||
-- KEYS[1] = flightInfo
|
||||
-- ARGV[1] = set 对数 N,其后为 N 对 field/value;再后为待删除 field(按代差集)
|
||||
-- 删除集边界:仅上一代 gen.flids − 新代 flids(按代,非全 hash)→ ADFT 自动存活。
|
||||
local key = KEYS[1]
|
||||
local nSet = tonumber(ARGV[1])
|
||||
local i = 2
|
||||
while i <= 1 + nSet * 2 do
|
||||
redis.call('HSET', key, ARGV[i], ARGV[i + 1])
|
||||
i = i + 2
|
||||
end
|
||||
local j = 2 + nSet * 2
|
||||
local deleted = 0
|
||||
while j <= #ARGV do
|
||||
redis.call('HDEL', key, ARGV[j])
|
||||
deleted = deleted + 1
|
||||
j = j + 1
|
||||
end
|
||||
return deleted
|
||||
Reference in New Issue
Block a user