You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

84 lines
4.8 KiB

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 字段为准,留空时回退到 "<前缀><appId>"。
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"`
}