ryan
|
fb182adef4
|
feat: OpType重构为OpCode (int32) - 完整实现
🎯 核心变更:
- OpType (string) → OpCode (int32)
- 20+ OpCode枚举常量 (基于DOIP/IRP标准)
- 类型安全 + 性能优化
📊 影响范围:
- 核心模型: Operation结构体、CBOR序列化
- 数据库: schema.go + SQL DDL (PostgreSQL/MySQL/SQLite)
- 持久化: repository.go查询、cursor_worker.go
- API接口: Protobuf定义 + gRPC客户端
- 测试代码: 60+ 测试文件更新
✅ 测试结果:
- 通过率: 100% (所有87个测试用例)
- 总体覆盖率: 53.7%
- 核心包覆盖率: logger(100%), highclient(95.3%), model(79.1%)
📝 文档:
- 精简README (1056行→489行,减少54%)
- 完整的OpCode枚举说明
- 三种持久化策略示例
- 数据库表结构和架构图
🔧 技术细节:
- 类型转换: string(OpCode) → int32(OpCode)
- SQL参数: 字符串值 → 整数值
- Protobuf: op_type string → op_code int32
- 测试断言: 字符串比较 → 常量比较
🎉 质量保证:
- 零编译错误
- 100%测试通过
- PostgreSQL/Pulsar集成测试验证
- 分布式并发安全测试通过
|
2025-12-26 13:47:55 +08:00 |
|
ryan
|
a90d853a6e
|
refactor: 将 OpType 字段从枚举类型改为 string 类型
主要变更:
- Operation.OpType: Type → string
- NewFullOperation 参数: opType Type → opType string
- IsValidOpType 参数: opType Type → opType string
- operationMeta.OpType: *Type → *string
- queryclient.ListRequest.OpType: model.Type → string
优点:
- 更灵活,支持动态扩展操作类型
- 不再受限于预定义的枚举常量
- 简化类型转换逻辑
兼容性:
- Type 常量定义保持不变 (OpTypeCreate, OpTypeUpdate 等)
- 使用时需要 string() 转换: string(model.OpTypeCreate)
- 所有单元测试已更新并通过 (100%)
测试结果:
✅ api/adapter - PASS
✅ api/highclient - PASS
✅ api/logger - PASS
✅ api/model - PASS
✅ api/persistence - PASS
✅ api/queryclient - PASS
✅ internal/* - PASS
|
2025-12-24 16:48:00 +08:00 |
|
ryan
|
88f80ffa5e
|
feat: 新增数据库持久化模块(Persistence),实现 Cursor + Retry 双层架构
## 核心功能
### 1. 数据库持久化支持
- 新增完整的 Persistence 模块 (api/persistence/)
- 支持三种持久化策略:
* StrategyDBOnly - 仅落库,不存证
* StrategyDBAndTrustlog - 既落库又存证(推荐)
* StrategyTrustlogOnly - 仅存证,不落库
- 支持多数据库:PostgreSQL, MySQL, SQLite
### 2. Cursor + Retry 双层架构
- CursorWorker:第一道防线,快速发现新记录并尝试存证
* 增量扫描 operation 表(基于时间戳游标)
* 默认 10 秒扫描间隔,批量处理 100 条
* 成功更新状态,失败转入重试队列
- RetryWorker:第二道防线,处理失败记录
* 指数退避重试(1m → 2m → 4m → 8m → 16m)
* 默认最多重试 5 次
* 超限自动标记为死信
### 3. 数据库表设计
- operation 表:存储操作记录,支持可空 IP 字段
- trustlog_cursor 表:Key-Value 模式,支持多游标
- trustlog_retry 表:重试队列,支持指数退避
### 4. 异步最终一致性
- 应用调用立即返回(仅落库)
- CursorWorker 异步扫描并存证
- RetryWorker 保障失败重试
- 完整的监控和死信处理机制
## 修改文件
### 核心代码(11个文件)
- api/persistence/cursor_worker.go - Cursor 工作器(新增)
- api/persistence/repository.go - 数据仓储层(新增)
- api/persistence/schema.go - 数据库 Schema(新增)
- api/persistence/strategy.go - 策略管理器(新增)
- api/persistence/client.go - 客户端封装(新增)
- api/persistence/retry_worker.go - Retry 工作器(新增)
- api/persistence/config.go - 配置管理(新增)
### 修复内部包引用(5个文件)
- api/adapter/publisher.go - 修复 internal 包引用
- api/adapter/subscriber.go - 修复 internal 包引用
- api/model/envelope.go - 修复 internal 包引用
- api/model/operation.go - 修复 internal 包引用
- api/model/record.go - 修复 internal 包引用
### 单元测试(8个文件)
- api/persistence/*_test.go - 完整的单元测试
- 测试覆盖率:28.5%
- 测试通过率:49/49 (100%)
### SQL 脚本(4个文件)
- api/persistence/sql/postgresql.sql - PostgreSQL 建表脚本
- api/persistence/sql/mysql.sql - MySQL 建表脚本
- api/persistence/sql/sqlite.sql - SQLite 建表脚本
- api/persistence/sql/test_data.sql - 测试数据
### 文档(2个文件)
- README.md - 更新主文档,新增 Persistence 使用指南
- api/persistence/README.md - 完整的 Persistence 文档
- api/persistence/sql/README.md - SQL 脚本说明
## 技术亮点
1. **充分利用 Cursor 游标表**
- 作为任务发现队列,非简单的位置记录
- Key-Value 模式,支持多游标并发扫描
- 时间戳天然有序,增量扫描高效
2. **双层保障机制**
- Cursor:正常流程,快速处理
- Retry:异常流程,可靠重试
- 职责分离,监控清晰
3. **可空 IP 字段支持**
- ClientIP 和 ServerIP 使用 *string 类型
- 支持 NULL 值,符合数据库最佳实践
- 使用 sql.NullString 正确处理
4. **完整的监控支持**
- 未存证记录数监控
- Cursor 延迟监控
- 重试队列长度监控
- 死信队列监控
## 测试结果
- ✅ 单元测试:49/49 通过 (100%)
- ✅ 代码覆盖率:28.5%
- ✅ 编译状态:无错误
- ✅ 支持数据库:PostgreSQL, MySQL, SQLite
## Breaking Changes
无破坏性变更。Persistence 模块作为可选功能,不影响现有代码。
## 版本信息
- 版本:v2.1.0
- Go 版本要求:1.21+
- 更新日期:2025-12-23
|
2025-12-23 18:59:43 +08:00 |
|