daShangDao_batch/go_files_explanation.md
2026-06-15 16:34:21 +08:00

181 lines
9.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Go 文件功能说明
## 项目概述
该项目是一个 **Go 批处理工具集**,主要用于数据同步和迁移任务,涉及 **MySQL**、**Elasticsearch** 和 **Redis** 之间的数据传输。
---
## 文件列表与功能
### 1. `main.go` — 项目入口(占位模板)
- **位置**:根目录
- **作用**GoLand 自动生成的默认入口文件,仅包含一个 `Hello, world` 打印程序。
- **说明**:不属于实际的批处理系统,可忽略或用作文档占位。
---
### 2. `util/dbConnectUtil/dbConnectUtil.go` — 数据库连接工具包
- **位置**`util/dbConnectUtil/`
- **包名**`dbConnectUtil`
- **作用**:提供可复用的 MySQL 数据库连接初始化函数。
- **核心功能**
- `InitDB(username, password, host, port)` — 创建并测试 MySQL 连接
- 配置连接池参数(最大打开 20 个、最大空闲 10 个)
- 返回全局变量 `DB``*sql.DB`
- **被依赖**`shop_mysql_to_redis/` 下的两个子项目都导入此包。
---
### 3. `addSyncSuitBook/main.go` — 图书数据同步工具
- **位置**`addSyncSuitBook/`
- **包名**`main`(独立可执行程序)
- **作用**:将源 MySQL 中的图书数据同步到目标 MySQL 和 Elasticsearch。
- **核心功能**
- **数据源**:源库 `book_lib` JOIN `book_lib_details`IP: `36.134.185.139:6603`
- **目标 MySQL**:写入 `suit_book_lib_merged`IP: `175.27.224.66:3306`
- **目标 ES**:写入 `books-from-mysql-v3` 索引IP: `36.212.12.92:9527`
- **同步模式**:全量同步 / 增量同步(基于 `update_time` 记录上次同步时间到 `sync_state.json`
- **套装书标记**:查询 v2 索引中已存在的 ISBN在 v3 索引中通过 script 更新 `is_suit = 1`
- **执行计划**:程序启动时立即执行一次,之后每天凌晨 01:00 自动执行
- **批量操作**MySQL 使用 `REPLACE INTO`ES 使用 `_bulk` API
---
### 4. `addSyncPddReject/main.go` — 拼多多违规商品迁移工具
- **位置**`addSyncPddReject/`
- **包名**`main`(独立可执行程序)
- **作用**:将主库中因"涉嫌违规"被驳回的商品 ISBN 迁移到从库的过滤表中。
- **核心功能**
- **源库**:查 `shop_goods_rejection` 表(原因:`'您发布的商品涉嫌违规,请您检查相关商品并立即整改'`
- **目标库**:写入 `t_filter_set` 表(`limitation_type = '0'` 表示 ISBN 过滤)
- **去重逻辑**:先查询目标表已有 ISBN仅插入不重复的新数据
- **ID 生成**雪花算法Snowflake生成 19 位分布式 ID
- **批量插入**:每批 100 条,带进度打印
---
### 5. `goods_es_to_redis/main.go` — ES 到 Redis 全量同步工具
- **位置**`goods_es_to_redis/`
- **包名**`main`(独立可执行程序)
- **作用**:从 Elasticsearch `books-from-mysql-v2` 索引全量拉取图书数据,写入 Redis DB 1。
- **核心功能**
- **数据读取**:使用 ES Scroll API 全量遍历(每批 10,000 条)
- **并发模型**
- 8 个 ES 读取协程m 并行处理 scroll 分页)
- 1 个批处理协程(聚合成 500 条/批)
- 32 个 Redis 写入协程(使用 Pipeline 批量 SET
- **数据转换**
- 自定义 `FlexInt64` JSON 反序列化(兼容数字/字符串)
- 自定义 `StringOrArray` 类型(兼容字符串/数组)
- 分类 ID 清洗:`A > B > C` → `A/B/C`
- 出版时间时间戳转换
- 图片信息聚合(轮播图、白底图、详情图、目录图等)
- **Redis 结构**`key = ISBN``value = BookInfo JSON`book_name/author/publisher/price/images/category 等)
- **数据校验**:同步完成后用 SCAN 命令校验 Redis 中的 key 数量是否与 ES 文档数一致
- **进度报告**:每 5 秒打印一次同步进度
---
### 6. `shop_mysql_to_redis/CameiCase/mysqlToRedisCameiCase.go` — 店铺数据迁移(驼峰版)
- **位置**`shop_mysql_to_redis/CameiCase/`
- **包名**`main`(独立可执行程序)
- **作用**:将 MySQL 中的店铺相关数据迁移到 Redis字段名为**驼峰命名**。
- **核心功能**
- **查询数据**:遍历 `t_shop_detail` 中的所有 `shop_id`
- **关联表**
- `t_shop` — 店铺主表
- `t_shop_detail` — 店铺详情
- `t_shop_context` — 店铺上下文(商品描述)
- `t_spec` — 规格设置
- `t_price_template` — 价格模板(根据 `sale_template_id` 关联)
- **数据格式**
- 每条记录以 `{"source_table": "表名", "data": {字段: 值...}}` 格式存入 Redis
- 字段名通过 `snakeToCamel()` 转为驼峰(如 `shop_id``shopId`
- 价格模板的 `rangePrice` 字段做浮点精度修复
- **Redis 结构**`key = shopID``value = List`,每元素为一条 JSON 记录
- **数据库连接**:使用 `dbConnectUtil` 工具包
---
### 7. `shop_mysql_to_redis/SanckCase/mysqlToRedis.go` — 店铺数据迁移(下划线版,优化版)
- **位置**`shop_mysql_to_redis/SanckCase/`
- **包名**`main`(独立可执行程序)
- **作用**:与驼峰版类似,但字段名为**下划线命名**,且架构更完善。
- **增强功能**
- **并发处理**3 个 Worker 并发处理店铺,每个店铺间 sleep 100ms 限流
- **循环执行**:每 5~10 分钟自动重跑(根据耗时动态调整间隔)
- **优雅退出**:监听 `SIGINT`/`SIGTERM` 信号,打印运行次数后退出
- **字段标准化**`normalizeFieldValue`
- ID 类字段(`id`, `*_id`, `create_by`, `update_by`)→ 字符串
- 时间字段(`create_time`, `update_time`, `add_time`, `expiration_time`)→ `"2006-01-02 15:04:05"` 格式
- `mall_id`、`district_id` 保持 `int64` 数字
- **图片处理**:从 `t_shop_img` 表查询图片,按 type 分类:
- `type=1` → 水印图
- `type=3/4` → 详情首/尾图
- `type=5` → 末尾轮播图
- `type=7` → SKU 水印图
- **价格处理**
- `range_price` 字段做浮点精度修复
- `add_amount` 字段 `×100` 转为 `int64`(分单位)
- **Redis 写入**:使用 Pipeline 批量操作(先 DEL 旧 key再 RPUSH 所有记录)
- **数据库连接**:使用 `dbConnectUtil` 工具包
---
## 数据流向总图
```
┌─────────────────────────────────────────────────────────────┐
│ addSyncSuitBook │
│ MySQL (36.134.185.139:6603) │
│ book_lib + book_lib_details │
│ ┌──────────┴──────────┐ │
│ ▼ ▼ │
│ MySQL (175.27.224.66) ES (36.212.12.92:9527) │
│ suit_book_lib_merged books-from-mysql-v3 │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ addSyncPddReject │
│ MySQL Master (146.56.227.42:3306) │
│ shop_goods_rejection │
│ ▼ │
│ MySQL Slave (36.212.12.247:3306) │
│ t_filter_set │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ goods_es_to_redis │
│ ES (36.212.12.92:9527) │
│ books-from-mysql-v2 │
│ ▼ │
│ Redis (36.212.12.247:6379 DB 1) │
│ key=ISBN → BookInfo JSON │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ shop_mysql_to_redis │
│ MySQL (146.56.227.42:3306) │
│ t_shop / t_shop_detail / t_shop_context │
│ t_spec / t_price_template / t_shop_img │
│ ▼ │
│ Redis (CameiCase: 36.212.20.113:7963 DB 7) │
│ (SanckCase: 36.212.12.247:6379 DB 8) │
│ key=shopID → List of JSON records │
└─────────────────────────────────────────────────────────────┘
```
## 依赖关系
- `dbConnectUtil``shop_mysql_to_redis/` 下的两个子项目导入
- 所有可执行程序均为 `package main`,各自独立运行
- 外部依赖:`go-sql-driver/mysql`、`go-elasticsearch`、`go-redis`