package model import "time" const ( // OutboxStatusPending 表示消息已写入 outbox,等待投递或重试窗口到达。 OutboxStatusPending = "pending" // OutboxStatusPublished 表示消息已成功写入 Kafka,但业务消费尚未完成。 OutboxStatusPublished = "published" // OutboxStatusConsumed 表示消息对应业务处理已成功完成(最终态)。 OutboxStatusConsumed = "consumed" // OutboxStatusDead 表示达到重试上限或出现不可恢复错误(最终态)。 OutboxStatusDead = "dead" ) // AgentOutboxMessage 是 outbox 状态机表模型。 // // 关键说明: // 1. EventType 映射到数据库 `biz_type` 列(为兼容历史表结构,不改 DDL); // 2. Payload 保存统一事件外壳 JSON; // 3. Status/RetryCount/NextRetryAt 组成重试状态机。 type AgentOutboxMessage struct { ID int64 `gorm:"column:id;primaryKey;autoIncrement"` EventType string `gorm:"column:biz_type;type:varchar(64);not null;index:idx_outbox_status_next,priority:3;comment:事件类型"` ServiceName string `gorm:"column:service_name;type:varchar(64);not null;default:'';index:idx_outbox_service_name,priority:1;comment:所属服务"` Topic string `gorm:"column:topic;type:varchar(128);not null;comment:Kafka Topic"` MessageKey string `gorm:"column:message_key;type:varchar(128);not null;comment:Kafka 消息键"` Payload string `gorm:"column:payload;type:longtext;not null;comment:业务载荷(JSON)"` Status string `gorm:"column:status;type:varchar(32);not null;index:idx_outbox_status_next,priority:1;comment:pending/published/consumed/dead"` RetryCount int `gorm:"column:retry_count;not null;default:0;comment:已重试次数"` MaxRetry int `gorm:"column:max_retry;not null;default:20;comment:最大重试次数"` NextRetryAt *time.Time `gorm:"column:next_retry_at;index:idx_outbox_status_next,priority:2;comment:下次重试时间"` LastError *string `gorm:"column:last_error;type:text;comment:最后一次错误"` PublishedAt *time.Time `gorm:"column:published_at;comment:投递到 Kafka 时间"` ConsumedAt *time.Time `gorm:"column:consumed_at;comment:消费完成时间"` CreatedAt *time.Time `gorm:"column:created_at;autoCreateTime"` UpdatedAt *time.Time `gorm:"column:updated_at;autoUpdateTime"` } func (AgentOutboxMessage) TableName() string { // 1. 这里保留历史兼容默认表名,避免非 outbox 基础设施调用直接失效。 // 2. 服务级多表路由由 backend/infra/outbox 显式通过 db.Table(...) 控制。 // 3. 这样既能兼容旧代码,也不会把共享单表当成终态。 return "agent_outbox_messages" }