181 lines
9.8 KiB
Markdown
181 lines
9.8 KiB
Markdown
# 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`
|