package comm // NATS 管道统一定义。 // // 跨服务的各类消息管道(subject / 事件结构)集中在此,便于统一管理与后续扩展—— // 新增管道在本文件追加,避免 subject 魔法字符串散落各处。 // // 两种语义按需选用: // - JetStream(持久、可回放、消费者可负载均衡):用于不能丢的数据流,如统计上报。 // 发布走 natssys.Publish/PublishAsync,订阅走 JetStream 持久消费者。 // - core NATS pub/sub(至多一次、fanout 到所有订阅者):用于广播类通知,如配置变更。 // 发布/订阅走 natssys.Conn().Publish / Conn().Subscribe。 const ( // Nats_StatEventSubject 统计上报管道(JetStream):各业务部署 analyze 把埋点事件双写到此, // console 消费落 stats_global_day。作为 canonical 名称;yaml(modules.analyze.Subject / // modules.console.Stat.Subject) 配置应与之一致。 Nats_StatEventSubject = "stats.event" // Nats_ConfigChangedSubject 配置变更广播(core NATS pub/sub):console 后台改了「全局共享配置」 // (全局环境配置/MCP/会议模板) 后向此 subject 广播;各业务服务订阅后重载对应缓存。 // 广播语义——所有订阅者都收到;漏收由业务侧 10 分钟定时同步兜底。 Nats_ConfigChangedSubject = "console.config.changed" // Nats_ConfigEventSubjectPrefix 按「单个应用」下发配置事件的 subject 前缀(JetStream)。 // 实际 subject 以注册项 nats_subject 字段为准,留空时回退到 "<前缀>"。 Nats_ConfigEventSubjectPrefix = "console.config." ) // 配置变更类型(ConfigChangedEvent.Kind 取值):业务侧据此重载对应缓存。 const ( ConfigKindGlobalConfig = "global_config" // 全局第三方服务配置(user 模块重载) ConfigKindMcp = "mcp" // MCP 服务器(user 模块重载) ConfigKindTemplate = "template" // 会议公共模板(echomeet 模块重载) ConfigKindThirdSvc = "third_svc" // 依赖服务配置(业务侧重载字段缓存) ConfigKindCallTranslate = "call_translate" // 通话翻译配置(translate 模块重载) ConfigKindServiceConfig = "service_config" // 应用×服务基础设施/运行配置(后台改后广播;DSN 等多需重启才生效) ConfigKindAgent = "agent" // yunyan 自管 Agent 配置(后台改后广播;下发客户端) ConfigKindModuleConfig = "module_config" // 应用业务功能配置(登录/短信/邮件/支付;存业务库,后台改后广播、业务侧重载) ConfigKindEchomeetSvc = "echomeet_svc" // 会议记录服务配置(识别/翻译/总结优先级+凭据;存业务库,后台改后广播;改配置重启生效) ) // ConfigChangedEvent console→业务 的「配置已变更」广播事件。 // 业务服务订阅 Nats_ConfigChangedSubject,收到后按 Kind 重载对应缓存。 type ConfigChangedEvent struct { Kind string `json:"kind"` // 变更的配置类型,见 ConfigKind* Action string `json:"action"` // add / update / delete Region int32 `json:"region"` // 关联区域(global_config/mcp 带;template 为 0) Ts int64 `json:"ts"` // 发出时间戳(秒) } // 配置热重载的单模块结果状态(ModuleApplyResult.Status 取值)。 // 三态必须如实回传:把「需要重启」谎报成「已生效」比不回应答更糟。 const ( ApplyStatusApplied = "applied" // 已热更生效 ApplyStatusRestartRequired = "restart_required" // 已收到,但该配置须重启才生效(未注册热重载函数) ApplyStatusFailed = "failed" // 重载失败,已保留旧配置继续服务 ) // ModuleApplyResult 单个业务模块的重载结果。 type ModuleApplyResult struct { Module string `json:"module"` // 模块键,见 ModuleCatalog(email/sms/wechatpay…) Status string `json:"status"` // ApplyStatus* Err string `json:"err,omitempty"` } // ConfigApplyReport 业务侧 api 服务对 console 的应答:本部署内**各业务服务**的重载结果汇总。 // console 据此告诉用户「N/M 个服务已生效、哪个失败了」。 type ConfigApplyReport struct { AppName string `json:"app_name"` Kind string `json:"kind"` Acks []ConfigApplyAck `json:"acks"` // 本部署内各业务服务各一条 Ts int64 `json:"ts"` } // ConfigApplyAck 单个业务服务的重载回执。 type ConfigApplyAck struct { AppName string `json:"app_name"` Region int32 `json:"region"` Instance string `json:"instance"` // <服务名>@<主机名>,便于定位是哪个实例失败 Kind string `json:"kind"` Results []ModuleApplyResult `json:"results"` Ts int64 `json:"ts"` }