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

9.8 KiB
Raw Blame History

Go 文件功能说明

项目概述

该项目是一个 Go 批处理工具集,主要用于数据同步和迁移任务,涉及 MySQLElasticsearchRedis 之间的数据传输。


文件列表与功能

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_detailsIP: 36.134.185.139:6603
    • 目标 MySQL:写入 suit_book_lib_mergedIP: 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 INTOES 使用 _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 > CA/B/C
      • 出版时间时间戳转换
      • 图片信息聚合(轮播图、白底图、详情图、目录图等)
    • Redis 结构key = ISBNvalue = BookInfo JSONbook_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_idshopId
      • 价格模板的 rangePrice 字段做浮点精度修复
    • Redis 结构key = shopIDvalue = 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_iddistrict_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                        │
└─────────────────────────────────────────────────────────────┘

依赖关系

  • dbConnectUtilshop_mysql_to_redis/ 下的两个子项目导入
  • 所有可执行程序均为 package main,各自独立运行
  • 外部依赖:go-sql-driver/mysqlgo-elasticsearchgo-redis