Files
msgexchange-v2/docs/reference.md
T

13 KiB
Raw Blame History

运行参考

本文件列出运行参数、固定调度时间、监控指标、代码位置和错误类别。业务约定见 specification.md,处理流程见 implementation.md;其他文档引用参数时使用 PARAM:<完整键>

参数注册表

表中数值来自当前配置或代码。「暂定」表示取值还没有业务或容量依据;「与需求冲突」表示当前配置不符合验收要求。

收报、处理与投递

参数 默认值 用途与约束 依据
msgx.pipeline.poll-interval 1s 每隔多久查询一次信箱 沿用旧系统
msgx.pipeline.claim-batch 50 一次最多从信箱读取多少条消息 暂定
msgx.pipeline.max-attempts 5 处理或发送一条消息最多尝试多少次 暂定
msgx.pipeline.backoff-ms [1000, 2000, 4000, 8000] ms 每次失败后等多久再试;等待时间档位数须比最多尝试次数少一 暂定
msgx.pipeline.backoff-cap-ms 60000 ms 失败后最长等待时间 暂定
msgx.pipeline.delivery-batch 200 一次最多领取多少条待发的 msg 消息 暂定
msgx.pipeline.delivery-drain-rounds 10 连续领取多少批后,先尝试发送一批 schd 消息 暂定
msgx.schd.flush-period 3s 每隔多久尝试发送一批 schd 消息 沿用旧系统
msgx.schd.flush-limit 500 一批 schd 消息最多包含多少个航班 暂定
msgx.schd.snapshot-batch 200 个航班 日计划一批最多写多少个航班,每批一个事务;缺席清扫按同一上限分批(US-07 AC4 暂定
msgx.pipeline.event-retention 7d 发送成功的消息在数据库保留多久,从 SENT_AT 起算 暂定
msgx.pipeline.terminal-retention 90d 处理记录(PROC_STATE 终态行)保留多久,从 UPDATED_AT 起算;到期且已回填才删除(US-11 暂定

写回信箱

参数 默认值 用途与约束 依据
msgx.pipeline.overdue-backfill 30d 入队后超过期限 R 仍未写回处理时间,就立即再试;若仍失败,则停止自动重试。R 不得长于信箱行可保证的最短保留期 暂定
msgx.pipeline.backfill-batch 100 一次最多检查多少条待写回信箱的记录 暂定
msgx.pipeline.backfill-max-attempts 100 失败次数达到此值时告警,仍继续重试直到期限 R 暂定
msgx.pipeline.backfill-backoff-ms 30000 ms 首次写回失败后等多久再试 暂定
msgx.pipeline.backfill-backoff-cap-ms 900000 ms 以后每次重试最长等多久 暂定

固定调度

下列名称只用于查阅固定时间,不能写入配置文件。

登记名 当前值 含义
msgx.pipeline.backfill-scan-period 30s 每隔多久检查待写回信箱的记录;不是完成时限
msgx.history.sweep-time 03:30 按机场时间每天开始清理历史航班的时间

运行开关与航班域

参数 默认值 用途与约束 依据
msgx.service-name msgexchangeapi 向 Eureka 注册时使用的服务名;用于对比的新实例须使用不同名称 沿用旧系统
msgx.register-eureka true 是否向 Eureka 注册服务 当前实现
msgx.stubs truedev 是否用内存数据代替真实数据库和消息系统;只在开发环境开启 开发环境
msgx.pipeline.autostart false 服务启动时是否自动读信箱、处理和发送消息 默认关闭
msgx.operation-day.zone Asia/Shanghai 计算运营日(按机场规则划分的航班日期)和清理历史航班时使用的时区;填错则拒绝启动 沿用旧系统
msgx.operation-day.cutoff-hour 0 按机场时间几点切换运营日;业务边界尚未确认 暂定
msgx.identity.include-day-boundary false 去重时是否把日期算进消息身份;受 C-3 约束,不能随意改变 默认关闭
msgx.health.backlog-cache-ttl-ms 30000 ms /health/metrics 共用的未处理消息统计最多缓存多久;0 表示每次重算 暂定
msgx.history.history-store-enabled false 是否启用历史航班写入;关闭时不删除实时航班 默认关闭
msgx.redis.enabled false 是否把航班快照写进 Redis 查询投影;关闭时投影写入是空操作 默认关闭
msgx.redis.flight-key flightInfo 航班快照所在的 Redis 哈希键,字段名是 FLID 沿用旧系统
redis.uri redis://127.0.0.1:6379 Redis 连接地址;生产通过 MSGX_REDIS_URI 覆盖 当前实现
msgx.outbound.response-timeout 30m 出站请求落信后等待应答的最长时间 暂定
msgx.outbound.routing-rqfd OSH5RQFD RQFD 写入 COUTMSGS 使用的路由标识 接口契约
msgx.outbound.routing-rqrd OMMSRQRD RQRD 写入 COUTMSGS 使用的路由标识 当前实现
msgx.history.planned-age-days 3 US-14 AC2 条件 1:计划时间早于当前超过该天数视为已结束 US-14 AC2
msgx.history.cancelled-hours 1 小时 US-14 AC2 条件 2:取消时间早于当前超过该窗口视为已结束 US-14 AC2
msgx.history.diverted-hours 1 小时 US-14 AC2 条件 3:备降且计划时间早于当前超过该窗口;备降依据 FDIVDDES/DDIR)落地前不参与判定(Q3、ACM2-100 US-14 AC2
msgx.history.arrived-hours 1 小时 US-14 AC2 条件 5:实际到港时间早于当前超过该窗口视为已结束(条件 4 离港不设窗口) US-14 AC2
msgx.history.snap-log-retention-days 90 日计划处理记录保存多久 暂定

信箱与外部依赖(成组登记)

参数 默认值 用途与约束 依据
mailbox.processed-value PROCESSED 写回处理时间时,同时写入 CMINMSGS_STATUSQ8 未确认这个状态值 当前实现
mailbox.shared-mysql.enabled false 是否连接共享 MySQL 信箱 默认关闭
mailbox.shared-mysql.url 环境变量 共享信箱地址;用户名和密码也从环境变量读取 当前实现
mailbox.shared-mysql.connect-timeout-ms 3000 ms 连接 MySQL 最长等待多久;同组读取最长等待 socket-timeout-ms=30000 ms 暂定
mailbox.shared-mysql.pool-connection-timeout-ms 5000 ms 等待一个可用的 MySQL 连接最长多久;同组校验连接最长等待 pool-validation-timeout-ms=3000 ms 暂定
datasources.default.connection-timeout 5000 ms 等待一个可用的 PostgreSQL 连接最长多久;同组连接校验 validation-timeout=3000、空闲时间 idle-timeout=300000、连接寿命 max-lifetime=1800000 ms 暂定
datasources.default.data-source-properties.connectTimeout 3 连接 PostgreSQL 最长等待多久;同组读取最长等待 socketTimeout=30 暂定
kafka.producers.default.acks all Kafka 何时确认收到消息;与下两项一起满足 D2 当前实现
kafka.producers.default.enable-idempotence true 是否避免 Kafka 生产者自身重复发送,见 D2 当前实现
kafka.producers.default.max-in-flight-requests-per-connection 1 一个连接同时最多发送多少个未确认请求,见 D2 当前实现

环境变量名见 .env.example;其余基础设施键见 src/main/resources/application.yml

启动必需配置与显式开关(CLM-7OPS-1

值非法即拒绝启动(无条件自检,不等 autostart):

校验项 条件 执行方
运营日时区(PARAM:msgx.operation-day.zone 必须是可解析的 IANA 时区 启动自检 OperationDayZoneCheck
切日边界(PARAM:msgx.operation-day.cutoff-hour 取值 023 启动自检 OperationDayZoneCheck
Kafka 生产者幂等三项 D2 三键联合满足幂等生产前提(all+true+1;旧 Broker 降级组合见 D2 启动自检 KafkaD3Check
退避表(PARAM:msgx.pipeline.backoff-ms 档位数必须等于 max-attempts 1 启动自检 PipelineConfigCheck

缺值:带环境变量占位的必需键(MSGX_PG_URLMSGX_MAILBOX_URLMSGX_KAFKA_SERVERS 等)缺失时由 DI 解析失败拒绝启动,无需自检代码。

显式开关(非配置错误)msgx.stubsdatasources.default.enabledmailbox.shared-mysql.enabledmsgx.history.history-store-enabledmsgx.redis.enabledmsgx.pipeline.autostart。默认关闭是"未接入"的显式声明,不判违规;只有 msgx.pipeline.autostart=true 才要求依赖齐备。Kafka 运行时不可达不是配置错误,归 /health 与投递指标告警(OPS-2)。

指标与健康

指标 含义 关注信号
msgx.pipeline.backlog.unfinished 尚未处理完的消息数 长期不降:消息越积越多
msgx.pipeline.backlog.oldest_unprocessed_seconds 最早收到且尚未处理的消息距今多久 持续增长:最早的消息一直没处理
msgx.pipeline.backfill.unmarked_terminal 处理已结束、但信箱还没写入处理时间的消息数 长期不降:写回信箱受阻
msgx.pipeline.backfill.abandoned 已停止自动写回信箱的消息数 非零:需要人工对账
msgx.pipeline.backfill.oldest_unmarked_seconds 最早待写回信箱的消息距今多久 持续增长:写回越来越慢
msgx.pipeline.job.heartbeat_age_seconds 上次作业成功运行距今多久 持续增长:作业可能已停
msgx.pipeline.job.last_failure_age_seconds 上次作业出错距今多久 结合出错次数判断故障
msgx.pipeline.job.ticks.total 作业成功运行的次数 不增长:作业可能已停
msgx.pipeline.job.failures.total 作业出错次数 增长:作业持续出错
msgx.pipeline.job.last_sweep_selected 上次检查找到多少条待写回信箱的记录 持续达到每批上限:待办太多
msgx.pipeline.codec.srvt_seen.total 收到含 SRVT 段的消息数 非零:核对 G-SRVT-VIPF
msgx.pipeline.codec.vipf_seen.total 收到含 VIPF 段的消息数 非零:核对 G-SRVT-VIPF
msgx.pipeline.processing.ignored.total IgnoreRules 跳过的消息数 现行清单仅 LDM-*REGN/RSTA/EROR 已改走 US-13/US-09
msgx.pipeline.delivery.send_failures.total{target} 该投递目标累计发送失败次数(进程内,重启归零) 持续增长且 dead 非零:投递链路故障(OPS-2
msgx.pipeline.delivery.dead{target} 该投递目标当前死信(DEAD)行数 非零即告警:死信需人工处置(OPS-2;状态语义见 implementation.md「状态与错误分类」)

未处理消息的统计使用同一份缓存;统计不可用显示 NaN,没有记录可比时年龄与编号差显示 -1。作业计数在进程重启后归零;作业已启动却连续三个检查周期没有成功运行时,/healthDOWN

模块与代码入口

关注点 代码入口
读取信箱与 HTTP 入口 ingress/InboxPoller.ktingress/InboxController.kt
XML 解析 codec/JacksonXmlCodec.ktcodec/SisWireMapper.kt
顺序处理与航班变更 processing/Pump.ktprocessing/DynamicProcessors.ktprocessing/ScheduleProcessor.kt
三步提交与 Redis 投影 processing/FlightCommit.ktprocessing/FlightProjection.ktinfra/projection/
写回信箱与发送 Kafka processing/BackfillService.ktdelivery/Dispatcher.ktinfra/kafka/KafkaDeliveryPort.kt
定时任务 jobs/JobRunner.ktjobs/HistorySweepJob.ktjobs/EventCleanupJob.kt
数据库读写与手动重试 infra/persistence/jdbc/infra/retry/
配置、指标与健康检查 config/infra/metrics/infra/health/

错误分类与重放白名单

错误类别 发生情况 处理结果 修复后可手动重试
MALFORMED 找不到原文,或 XML、必要字段无效 立即记 DEAD,停止自动处理
PROTOCOL 整份报文未通过业务校验,或运营日不一致 整份不写数据库,记 DEAD
CODEC_ERROR 解码程序尚不能识别报文结构 FAILED,等待后重试
UNSUPPORTED(合法未知类型) 报文种类可识别,但没有对应处理程序(MsgKind.Unsupported SKIPPED,写回信箱为已处理(US-03 AC2 否(终态,不进重放白名单)
INFRA 数据库、网络或程序执行出错 FAILED,等待后重试
EXHAUSTED 自动重试次数已用尽 DEAD;原错误类别被覆盖,原因留在 LAST_ERROR

停止自动写回信箱时,记录原因 MISSING_ROW(信箱行不存在)或 TRANSIENT_DEADLINE(故障持续到期限 R)。两种情况都没有确认处理时间已写入;恢复和清理条件见 implementation.md「回填」。