优化部署流程

This commit is contained in:
eafonyang
2026-06-30 13:50:29 +08:00
parent a52adf7e27
commit 23f712cf86
9 changed files with 362 additions and 204 deletions
@@ -31,20 +31,20 @@
- [pkg/encode/base64.go](file://pkg/encode/base64.go)
- [sql/model.sql](file://sql/model.sql)
- [sql/ota.sql](file://sql/ota.sql)
- [sql/ota_target_device.sql](file://sql/ota_target_device.sql)
- [sql/black_list.sql](file://sql/black_list.sql)
- [sql/share_code_log.sql](file://sql/share_code_log.sql)
- [sql/user_device.sql](file://sql/user_device.sql)
- [sql/user_active.sql](file://sql/user_active.sql)
- [sql/ota_target_device.sql](file://sql/ota_target_device.sql)
- [cmd/server/main.go](file://cmd/server/main.go)
</cite>
## 更新摘要
**变更内容**
- 新增分享代码数据模型(ShareCodeData)和相关处理流程
- 新增目标数据模型(Target),支持曲线目标配置
- 增强OTA模型,支持布尔值序列化和更多字段
- 新增分享码持久化任务和Redis缓存机制
- 扩展路由配置以支持分享码相关API端点
- OTA模型字段简化:移除了pawVerCode、pawVerName、pawUrl、pawMd5四个冗余字段,OTA结构现在更加简洁
- OTA模型现在包含核心字段:verCode、verName、url、md5、force、desc、model、hw、target、beta、startTime、endTime、status
- 数据库表结构同步更新,移除了对应的冗余列
- 仓库层和处理器层相应调整,移除了对冗余字段的处理
## 目录
1. [简介](#简介)
@@ -158,7 +158,7 @@ CACHE --> SHARE_TTL
- [internal/handler/brand.go:19-50](file://internal/handler/brand.go#L19-L50)
- [internal/handler/model.go:19-51](file://internal/handler/model.go#L19-L51)
- [internal/handler/model_list.go:19-57](file://internal/handler/model_list.go#L19-L57)
- [internal/handler/ota.go:14-133](file://internal/handler/ota.go#L14-L133)
- [internal/handler/ota.go:14-145](file://internal/handler/ota.go#L14-L145)
- [internal/handler/device.go:15-83](file://internal/handler/device.go#L15-L83)
- [internal/handler/share_code.go:1-383](file://internal/handler/share_code.go#L1-L383)
- [internal/handler/curve.go:1-582](file://internal/handler/curve.go#L1-L582)
@@ -170,7 +170,7 @@ CACHE --> SHARE_TTL
- [internal/repository/curve.go:1-66](file://internal/repository/curve.go#L1-L66)
- [internal/model/brand.go:3-7](file://internal/model/brand.go#L3-L7)
- [internal/model/model.go:5-15](file://internal/model/model.go#L5-L15)
- [internal/model/ota.go:5-67](file://internal/model/ota.go#L5-L67)
- [internal/model/ota.go:5-63](file://internal/model/ota.go#L5-L63)
- [internal/model/user_device.go:5-12](file://internal/model/user_device.go#L5-L12)
- [internal/model/user_active.go:5-13](file://internal/model/user_active.go#L5-L13)
- [internal/model/share_code.go:14-25](file://internal/model/share_code.go#L14-L25)
@@ -180,11 +180,12 @@ CACHE --> SHARE_TTL
- [internal/config/database.go:17-72](file://internal/config/database.go#L17-L72)
- [internal/config/share_code_ttl.go:12-60](file://internal/config/share_code_ttl.go#L12-L60)
- [sql/model.sql:20-38](file://sql/model.sql#L20-L38)
- [sql/ota.sql:23-44](file://sql/ota.sql#L23-L44)
- [sql/ota.sql:23-40](file://sql/ota.sql#L23-L40)
- [sql/ota_target_device.sql:23-31](file://sql/ota_target_device.sql#L23-L31)
- [sql/black_list.sql:23-30](file://sql/black_list.sql#L23-L30)
- [sql/share_code_log.sql:8-23](file://sql/share_code_log.sql#L8-L23)
- [sql/user_device.sql:23-32](file://sql/user_device.sql#L23-L32)
- [sql/user_active.sql:23-32](file://sql/user_active.sql#L23-L32)
- [sql/ota_target_device.sql:23-31](file://sql/ota_target_device.sql#L23-L31)
- [internal/task/device_persist.go:14-167](file://internal/task/device_persist.go#L14-L167)
- [internal/task/share_code_persist.go:1-232](file://internal/task/share_code_persist.go#L1-L232)
@@ -230,7 +231,7 @@ CACHE --> SHARE_TTL
**章节来源**
- [internal/model/brand.go:3-7](file://internal/model/brand.go#L3-L7)
- [internal/model/model.go:5-15](file://internal/model/model.go#L5-L15)
- [internal/model/ota.go:5-67](file://internal/model/ota.go#L5-L67)
- [internal/model/ota.go:5-63](file://internal/model/ota.go#L5-L63)
- [internal/model/share_code.go:14-25](file://internal/model/share_code.go#L14-L25)
- [internal/model/target.go:5-14](file://internal/model/target.go#L5-L14)
- [internal/model/user_device.go:5-12](file://internal/model/user_device.go#L5-L12)
@@ -244,7 +245,7 @@ CACHE --> SHARE_TTL
- [internal/handler/brand.go:26-50](file://internal/handler/brand.go#L26-L50)
- [internal/handler/model.go:26-51](file://internal/handler/model.go#L26-L51)
- [internal/handler/model_list.go:26-57](file://internal/handler/model_list.go#L26-L57)
- [internal/handler/ota.go:23-133](file://internal/handler/ota.go#L23-L133)
- [internal/handler/ota.go:23-145](file://internal/handler/ota.go#L23-L145)
- [internal/handler/device.go:27-83](file://internal/handler/device.go#L27-L83)
- [internal/handler/share_code.go:15-383](file://internal/handler/share_code.go#L15-L383)
- [internal/handler/curve.go:27-582](file://internal/handler/curve.go#L27-L582)
@@ -402,42 +403,41 @@ ModelRepository --> Model : "返回"
### OTA 固件升级模型
- **设计理念**
- OTA模型用于管理固件升级信息,支持强制升级、灰度发布、定向升级等功能。
- **更新**OTA模型已简化,移除了pawVerCode、pawVerName、pawUrl、pawMd5四个冗余字段,现在只包含核心升级信息字段。
- **字段定义与约束**
- OTA模型:
- id:整数,主键,自增。
- verCode:整数,版本号,用于排序。
- verName:字符串,版本名称。
- url:字符串,固件下载地址。
- md5:字符串,固件MD5校验值。
- forceBoolInt,是否强制升级(true/false)。
- desc:字符串指针,升级描述。
- model:字符串指针,对应设备型号。
- hw:整数,硬件版本号。
- targetBoolInt,是否定向升级(true/false)。
- betaBoolInt,是否灰度发布(true/false)。
- pawVerCode:整数,配套软件版本号
- pawVerName:字符串,配套软件版本名称
- pawUrl:字符串,配套软件下载地址
- pawMD5:字符串,配套软件MD5校验值。
- startTime:时间戳指针,升级开始时间。
- endTime:时间戳指针,升级结束时间。
- status:整数,状态(1-可用,0-不可用)。
- VerCode:整数,版本号,用于排序。
- VerName:字符串,版本名称。
- URL:字符串,固件下载地址。
- MD5:字符串,固件MD5校验值。
- ForceBoolInt,是否强制升级(true/false)。
- Desc:字符串指针,升级描述。
- Model:字符串指针,对应设备型号。
- HW:整数,硬件版本号。
- TargetBoolInt,是否定向升级(true/false)。
- BetaBoolInt,是否灰度发布(true/false)。
- StartTime:时间戳指针,升级开始时间
- EndTime:时间戳指针,升级结束时间
- Status:整数,状态(1-可用,0-不可用)
- BlackList模型:
- id:整数,主键,自增。
- ota_id:整数,关联OTA记录ID。
- mac:字符串,设备MAC地址。
- create_at:时间戳,创建时间。
- OTAID:整数,关联OTA记录ID。
- Mac:字符串,设备MAC地址。
- CreateAt:时间戳,创建时间。
- OTATargetDevice模型:
- id:整数,主键,自增。
- ota_id:整数,关联OTA记录ID。
- mac_addr:字符串,设备MAC地址。
- type:整数,类型(1-白名单,2-黑名单)。
- create_at:时间戳,创建时间。
- OTAID:整数,关联OTA记录ID。
- MacAddr:字符串,设备MAC地址。
- Type:整数,类型(1-白名单,2-黑名单)。
- CreateAt:时间戳,创建时间。
- **业务含义**
- 支持复杂的固件升级策略,包括强制升级、灰度发布、定向升级和黑名单管理。
- 简化的字段结构提高了数据模型的清晰度和维护性。
- **数据库映射**
- 表名:ota、black_list、ota_target_device。
- 字段:完整映射关系详见数据库表结构。
- **更新**OTA表不再包含pawVerCode、pawVerName、pawUrl、pawMd5字段。
- **ORM 映射配置**
- 使用 sql.NullString 和 sql.NullTime 扫描可空列。
- BoolInt类型支持数据库整型与JSON布尔值的双向转换。
@@ -449,37 +449,33 @@ ModelRepository --> Model : "返回"
```mermaid
classDiagram
class OTA {
+int id
+int verCode
+string verName
+string url
+string md5
+BoolInt force
+*string desc
+*string model
+int hw
+BoolInt target
+BoolInt beta
+int pawVerCode
+string pawVerName
+string pawUrl
+string pawMD5
+*time startTime
+*time endTime
+int status
+int ID
+int VerCode
+string VerName
+string URL
+string MD5
+BoolInt Force
+*string Desc
+*string Model
+int HW
+BoolInt Target
+BoolInt Beta
+*time StartTime
+*time EndTime
+int Status
}
class BlackList {
+int id
+int ota_id
+string mac
+time create_at
+int ID
+int OTAID
+string Mac
+time CreateAt
}
class OTATargetDevice {
+int id
+int ota_id
+string mac_addr
+int type
+time create_at
+int ID
+int OTAID
+string MacAddr
+int Type
+time CreateAt
}
class OTARepository {
-db *sql.DB
@@ -495,15 +491,15 @@ OTARepository --> OTATargetDevice : "返回"
```
**图表来源**
- [internal/model/ota.go:29-67](file://internal/model/ota.go#L29-L67)
- [internal/model/ota.go:29-63](file://internal/model/ota.go#L29-L63)
- [internal/repository/ota.go:19-159](file://internal/repository/ota.go#L19-L159)
- [sql/ota.sql:24-44](file://sql/ota.sql#L24-L44)
- [sql/ota.sql:24-40](file://sql/ota.sql#L24-L40)
- [sql/ota_target_device.sql:24-31](file://sql/ota_target_device.sql#L24-L31)
**章节来源**
- [internal/model/ota.go:5-67](file://internal/model/ota.go#L5-L67)
- [internal/model/ota.go:5-63](file://internal/model/ota.go#L5-L63)
- [internal/repository/ota.go:19-159](file://internal/repository/ota.go#L19-L159)
- [sql/ota.sql:23-44](file://sql/ota.sql#L23-L44)
- [sql/ota.sql:23-40](file://sql/ota.sql#L23-L40)
- [sql/ota_target_device.sql:23-31](file://sql/ota_target_device.sql#L23-L31)
### 分享码数据模型
@@ -714,6 +710,7 @@ DeviceRepository --> UserActive : "返回"
- **OTA处理器特殊逻辑**
- 支持参数校验、黑名单检查、定向设备检查等复杂业务逻辑。
- 根据不同情况返回不同的OTA升级信息。
- **更新**:OTA处理器现在处理简化的字段结构,移除了对paw*字段的处理。
- **设备处理器特殊逻辑**
- 将设备信息写入Redis缓存,支持异步持久化。
- 提供设备信息上报接口。
@@ -760,7 +757,7 @@ H-->>C : "200 OK + EQ数据"
- [internal/handler/brand.go:26-50](file://internal/handler/brand.go#L26-L50)
- [internal/handler/model.go:26-51](file://internal/handler/model.go#L26-L51)
- [internal/handler/model_list.go:26-57](file://internal/handler/model_list.go#L26-L57)
- [internal/handler/ota.go:23-133](file://internal/handler/ota.go#L23-L133)
- [internal/handler/ota.go:23-145](file://internal/handler/ota.go#L23-L145)
- [internal/handler/device.go:27-83](file://internal/handler/device.go#L27-L83)
- [internal/handler/share_code.go:15-383](file://internal/handler/share_code.go#L15-L383)
- [internal/handler/curve.go:27-582](file://internal/handler/curve.go#L27-L582)
@@ -777,6 +774,7 @@ H-->>C : "200 OK + EQ数据"
- 支持按model+hw+beta+status=1查询最新OTA记录。
- 支持黑名单检查和定向设备检查。
- 提供多种查询策略以适应不同的升级场景。
- **更新**:OTA查询现在使用简化的字段列表,移除了对paw*字段的查询。
- **设备查询**
- 支持按MAC地址查询设备信息。
- 支持按MAC地址和日期查询活跃记录。
@@ -882,7 +880,7 @@ Task_Share --> Redis
- [internal/handler/brand.go:14-50](file://internal/handler/brand.go#L14-L50)
- [internal/handler/model.go:14-51](file://internal/handler/model.go#L14-L51)
- [internal/handler/model_list.go:14-57](file://internal/handler/model_list.go#L14-L57)
- [internal/handler/ota.go:14-133](file://internal/handler/ota.go#L14-L133)
- [internal/handler/ota.go:14-145](file://internal/handler/ota.go#L14-L145)
- [internal/handler/device.go:15-83](file://internal/handler/device.go#L15-L83)
- [internal/handler/share_code.go:15-383](file://internal/handler/share_code.go#L15-L383)
- [internal/handler/curve.go:27-582](file://internal/handler/curve.go#L27-L582)
@@ -909,6 +907,7 @@ Task_Share --> Redis
- UserActive表对(mac_addr, active_date)建立联合索引,支持按日期分区查询。
- share_code_log表对(mac_addr, share_code, create_at)建立索引,支持分享码查询。
- 查询时优先按品牌名匹配,减少 LIKE 的范围。
- **更新**:OTA查询现在使用简化的字段列表,减少了不必要的字段扫描。
- **扫描与内存**
- 使用 sql.NullString 扫描可空列,避免零值歧义;转换为指针字符串减少冗余存储。
- OTA模型使用BoolInt类型处理布尔值,支持数据库整型与JSON布尔值的双向转换。
@@ -927,7 +926,7 @@ Task_Share --> Redis
**章节来源**
- [sql/model.sql:34-35](file://sql/model.sql#L34-L35)
- [sql/ota.sql:24-44](file://sql/ota.sql#L24-L44)
- [sql/ota.sql:24-40](file://sql/ota.sql#L24-L40)
- [sql/share_code_log.sql:20-23](file://sql/share_code_log.sql#L20-L23)
- [sql/user_device.sql:24-32](file://sql/user_device.sql#L24-L32)
- [sql/user_active.sql:24-32](file://sql/user_active.sql#L24-L32)
@@ -957,6 +956,7 @@ Task_Share --> Redis
- 检查Redis:确认设备信息、分享码数据是否正确写入Redis缓存。
- 监控任务:确认设备持久化任务和分享码持久化任务是否按预期执行。
- 检查分布式锁:确认分享码操作的分布式锁状态和超时处理。
- **更新**:检查OTA表结构,确认paw*字段不存在,验证简化的字段结构。
**章节来源**
- [internal/config/database.go:57-72](file://internal/config/database.go#L57-L72)
@@ -965,12 +965,16 @@ Task_Share --> Redis
- [internal/handler/model_list.go:39-42](file://internal/handler/model_list.go#L39-L42)
- [internal/handler/ota.go:31-48](file://internal/handler/ota.go#L31-L48)
- [internal/handler/device.go:33-39](file://internal/handler/device.go#L33-L39)
- [internal/handler/share_code.go:46-81](file://internal/handler/share_code.go#L46-81)
- [internal/handler/share_code.go:46-81](file://internal/handler/share_code.go#L46-L81)
- [internal/handler/curve.go:302-368](file://internal/handler/curve.go#L302-L368)
- [internal/response/response.go:30-37](file://internal/response/response.go#L30-L37)
## 结论
本项目的数据模型设计简洁明确:Brand 与 Model 分别承担品牌与型号的维度,通过仓库层的原生 SQL 访问实现高效查询;处理器层统一响应与可选编码,提升传输效率与前端体验。新增的分享码功能、目标曲线模型和增强的OTA模型进一步完善了系统的数据模型体系,支持复杂的固件升级策略、设备信息跟踪、用户行为分析和EQ数据分享功能。数据库层面通过唯一索引与合理字段设计保障一致性与性能。Redis缓存层提供了高性能的临时数据存储和分布式锁机制。建议在后续迭代中引入显式的校验与转换层,增强健壮性与可维护性,同时考虑添加更多的监控指标和告警机制。
本项目的数据模型设计简洁明确:Brand 与 Model 分别承担品牌与型号的维度,通过仓库层的原生 SQL 访问实现高效查询;处理器层统一响应与可选编码,提升传输效率与前端体验。新增的分享码功能、目标曲线模型和增强的OTA模型进一步完善了系统的数据模型体系,支持复杂的固件升级策略、设备信息跟踪、用户行为分析和EQ数据分享功能。数据库层面通过唯一索引与合理字段设计保障一致性与性能。Redis缓存层提供了高性能的临时数据存储和分布式锁机制。
**更新**:OTA模型经过简化重构,移除了pawVerCode、pawVerName、pawUrl、pawMd5四个冗余字段,现在只包含核心升级信息,提高了数据模型的清晰度和维护性。新的字段结构更加简洁,减少了不必要的数据冗余,同时保持了完整的升级策略支持能力。
建议在后续迭代中引入显式的校验与转换层,增强健壮性与可维护性,同时考虑添加更多的监控指标和告警机制。
## 附录
@@ -979,8 +983,9 @@ Task_Share --> Redis
- 字段:id(主键)、brand_name、name、form、rig、source、eq_key、create_at。
- 约束:唯一索引 (brand_name, name)。
- **表:ota**
- 字段:id(主键)、verCode、verName、url、md5、force、desc、model、hw、target、beta、pawVerCode、pawVerName、pawUrl、pawMd5、startTime、endTime、status。
- 字段:id(主键)、verCode、verName、url、md5、force、desc、model、hw、target、beta、startTime、endTime、status。
- 约束:无显式约束。
- **更新**:移除了pawVerCode、pawVerName、pawUrl、pawMd5字段。
- **表:black_list**
- 字段:id(主键)、ota_id、mac、create_at。
- 约束:无显式约束。
@@ -1003,33 +1008,29 @@ Task_Share --> Redis
- Model.id ↔ model.id
- Model.brandName ↔ model.brand_name
- Model.name ↔ model.name
- OTA.id ↔ ota.id
- OTA.verCode ↔ ota.verCode
- OTA.verName ↔ ota.verName
- OTA.url ↔ ota.url
- OTA.md5 ↔ ota.md5
- OTA.force ↔ ota.force
- OTA.desc ↔ ota.desc
- OTA.model ↔ ota.model
- OTA.hw ↔ ota.hw
- OTA.target ↔ ota.target
- OTA.beta ↔ ota.beta
- OTA.pawVerCode ↔ ota.pawVerCode
- OTA.pawVerName ↔ ota.pawVerName
- OTA.pawUrl ↔ ota.pawUrl
- OTA.pawMD5 ↔ ota.pawMD5
- OTA.startTime ↔ ota.startTime
- OTA.endTime ↔ ota.endTime
- OTA.status ↔ ota.status
- BlackList.id ↔ black_list.id
- BlackList.ota_id ↔ black_list.ota_id
- BlackList.mac ↔ black_list.mac
- BlackList.create_at ↔ black_list.create_at
- OTATargetDevice.id ↔ ota_target_device.id
- OTATargetDevice.ota_id ↔ ota_target_device.ota_id
- OTATargetDevice.mac_addr ↔ ota_target_device.mac_addr
- OTATargetDevice.type ↔ ota_target_device.type
- OTATargetDevice.create_at ↔ ota_target_device.create_at
- OTA.ID ↔ ota.id
- OTA.VerCode ↔ ota.verCode
- OTA.VerName ↔ ota.verName
- OTA.URL ↔ ota.url
- OTA.MD5 ↔ ota.md5
- OTA.Force ↔ ota.force
- OTA.Desc ↔ ota.desc
- OTA.Model ↔ ota.model
- OTA.HW ↔ ota.hw
- OTA.Target ↔ ota.target
- OTA.Beta ↔ ota.beta
- OTA.StartTime ↔ ota.startTime
- OTA.EndTime ↔ ota.endTime
- OTA.Status ↔ ota.status
- BlackList.ID ↔ black_list.id
- BlackList.OTAID ↔ black_list.ota_id
- BlackList.Mac ↔ black_list.mac
- BlackList.CreateAt ↔ black_list.create_at
- OTATargetDevice.ID ↔ ota_target_device.id
- OTATargetDevice.OTAID ↔ ota_target_device.ota_id
- OTATargetDevice.MacAddr ↔ ota_target_device.mac_addr
- OTATargetDevice.Type ↔ ota_target_device.type
- OTATargetDevice.CreateAt ↔ ota_target_device.create_at
- UserDevice.id ↔ user_device.id
- UserDevice.mac_addr ↔ user_device.mac_addr
- UserDevice.model ↔ user_device.model
@@ -1059,14 +1060,15 @@ Task_Share --> Redis
**章节来源**
- [sql/model.sql:24-35](file://sql/model.sql#L24-L35)
- [sql/ota.sql:24-44](file://sql/ota.sql#L24-L44)
- [sql/ota.sql:24-40](file://sql/ota.sql#L24-L40)
- [sql/ota_target_device.sql:24-31](file://sql/ota_target_device.sql#L24-L31)
- [sql/black_list.sql:24-30](file://sql/black_list.sql#L24-L30)
- [sql/user_device.sql:24-32](file://sql/user_device.sql#L24-L32)
- [sql/user_active.sql:24-32](file://sql/user_active.sql#L24-L32)
- [sql/share_code_log.sql:9-23](file://sql/share_code_log.sql#L9-L23)
- [sql/target.sql:24-31](file://sql/target.sql#L24-L31)
- [internal/model/model.go:5-15](file://internal/model/model.go#L5-L15)
- [internal/model/ota.go:29-67](file://internal/model/ota.go#L29-L67)
- [internal/model/ota.go:29-63](file://internal/model/ota.go#L29-L63)
- [internal/model/user_device.go:5-12](file://internal/model/user_device.go#L5-L12)
- [internal/model/user_active.go:5-13](file://internal/model/user_active.go#L5-L13)
- [internal/model/share_code.go:14-25](file://internal/model/share_code.go#L14-L25)
@@ -1096,7 +1098,8 @@ Task_Share --> Redis
- 方法:GET
- 参数:model(必需)、hw(必需)、mac(可选)、beta(可选)、base64Resp(可选)
- 返回:OTA对象或 Base64 编码后的 JSON
- 参考路径:[internal/handler/ota.go:23-133](file://internal/handler/ota.go#L23-L133)
- **更新**:返回的OTA对象现在包含简化的字段结构
- 参考路径:[internal/handler/ota.go:23-145](file://internal/handler/ota.go#L23-L145)
- **设备信息上报**
- 路由:/audio/reportDevInfo
- 方法:GET
@@ -1133,7 +1136,7 @@ Task_Share --> Redis
- [internal/handler/brand.go:26-50](file://internal/handler/brand.go#L26-L50)
- [internal/handler/model.go:26-51](file://internal/handler/model.go#L26-L51)
- [internal/handler/model_list.go:26-57](file://internal/handler/model_list.go#L26-L57)
- [internal/handler/ota.go:23-133](file://internal/handler/ota.go#L23-L133)
- [internal/handler/ota.go:23-145](file://internal/handler/ota.go#L23-L145)
- [internal/handler/device.go:27-83](file://internal/handler/device.go#L27-L83)
- [internal/handler/share_code.go:40-125](file://internal/handler/share_code.go#L40-L125)
- [internal/handler/share_code.go:192-211](file://internal/handler/share_code.go#L192-L211)
@@ -1146,11 +1149,13 @@ Task_Share --> Redis
- 对可空字段提供默认值策略,避免前端空值判断复杂化。
- OTA模型支持复杂的升级策略,建议在业务层添加更多的参数验证。
- 分享码模型支持多种设备型号,建议添加设备型号验证和限制。
- **更新**:OTA模型简化后,减少了字段验证的复杂度,但仍需确保核心字段的完整性。
- **版本管理与向后兼容**
- 通过 API 版本号(如 /api/v1)隔离变更;新增字段采用可选策略,保持旧字段必填。
- 对于破坏性变更,提供迁移脚本与双写策略。
- OTA升级策略的变更需要谨慎处理,确保向后兼容性。
- 分享码功能的新增不影响现有API,保持向前兼容。
- **更新**:OTA模型的简化属于向后兼容的重构,不会影响现有API调用。
- **性能优化**
- 为高频查询字段建立索引;避免 SELECT *,仅选择必要字段。
- 对大列表启用可选 Base64 编码;结合分页与缓存策略。
@@ -1158,6 +1163,7 @@ Task_Share --> Redis
- OTA查询使用复合索引,支持快速定位最新OTA记录。
- 分享码使用Redis缓存,支持TTL自动过期和分布式锁。
- 目标曲线使用Redis缓存,优化fr数据的独立存储。
- **更新**:OTA查询现在使用简化的字段列表,减少了查询开销。
- **错误处理与可观测性**
- 统一错误码与消息格式;记录关键链路日志;对数据库与外部服务增加超时与重试。
- OTA查询失败需要详细的日志记录,包括参数、查询结果等。
@@ -1176,4 +1182,5 @@ Task_Share --> Redis
- 添加数据库连接池监控,避免连接泄漏。
- 添加任务调度监控,确保持久化任务正常执行。
- 添加分布式锁监控,防止死锁和资源竞争。
- 添加S3访问监控,确保CSV文件读取正常。
- 添加S3访问监控,确保CSV文件读取正常。
- **更新**:监控OTA表结构变化,确保简化的字段结构得到正确应用。