Files
iotlcm/README.md
T
MiFaZhan 2bec257289 chore: 初始开源发布
iotlcm-worker-svr:异步执行中枢(RabbitMQ 消费者 + 全量同步编排)。

- Go module:iotlcm-worker-svr → git.5iot.com/iotlcm-public/iotlcm-worker-svr(214 文件)
- 凭据与内部标识脱敏:MySQL/Redis 凭据、私网与生产 IP、内网域名、
  库名 xiujie_admin → iotlcm、哨兵名占位
- 159 处真实手机号 → 合法 11 位编造号(保留号段与后 4 位,维持互异,
  不破坏「校验 MSISDN 格式」等测试断言)
- 移除内部资产:CI 触发器、Jenkins 触发测试文档、预演门禁与镜像
  digest 记录
- Dockerfile 改用公共基础镜像(golang:1.25-alpine → alpine:3.23),
  移除写死的 git 凭据
- README 重写(架构/全量同步模型/配置/已知失败),补 Apache-2.0
  LICENSE,LF 行尾 + .gitattributes

已知:3 个测试包在源仓同一提交上同样失败(client/upstream、
service/allocate、service/inbound),属既有缺陷,本仓未引入亦未修复。
2026-10-22 16:37:56 +08:00

121 lines
4.7 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.
# iotlcm-worker-svr
iotLCM 物联网卡全生命周期管理平台的**异步执行中枢** —— RabbitMQ 消费者 + 全量同步编排器。
平台的大部分耗时操作(批量开停复机、续费变更、流量/状态/IMEI 全量同步、达量断网、工单自动关闭)都在本服务里异步执行。
## 特性
- **多队列消费者**:注册业务消费者处理重试队列、批次执行、工单等
- **全量同步编排**:卡状态 / 本月流量 / 日流量 / 月流量历史 / IMEI 五条全量同步链路,统一的 Producer(扫描 + 供料)→ Consumer(领取 + 执行)模型
- **通道级并发与限速**:按通道模板配置 QPS,按通道隔离并发度
- **多轮执行**:失败卡进入下一轮重试,单轮上限与轮次上限可配
- **运行归档**:每轮执行产出终态 JSON 归档,供通知与排障使用
- **可观测**:阶段耗时、库存水位、缺料观测等遥测写入归档
## 技术栈
- Go 1.25 + GoFrame v2
- RabbitMQ(`github.com/rabbitmq/amqp091-go`)
- MySQL(业务库)、Redis(任务队列与锁)、TDengine(用量时序)
- 支付宝(余额充值)、excelize(Excel 导入导出)
## 快速开始
```bash
go mod tidy
go run .
```
## 配置
配置文件在 `config/config_default.yaml`(默认配置)与 `config/config.yaml`(部署时覆盖)。**公开版里的凭据与地址全部是占位符**:
| 配置项 | 占位 | 说明 |
| --- | --- | --- |
| `database.default.link` | `${DB_USER}:${DB_PASSWORD}@tcp(${DB_HOST}:3306)` | 业务库 |
| `redis.default.address` | `${REDIS_ADDR}` | 任务队列 |
| `redis.default.pass` | `${REDIS_PASSWORD}` | 缓存口令 |
上游凭据(AppKey / AppSecret)**不写在本仓**,存放在通道表 `t_sim_channels` 与通道模板表里,由平台写入。
## 目录结构
```text
iotlcm-worker-svr/
├── internal/
│ ├── cmd/ # 启动装配
│ ├── consumer/
│ │ ├── rabbitmq/ # RabbitMQ 消费者(批次、重试、工单等)
│ │ └── zset/ # 全量同步消费者(ZSet 任务队列)
│ ├── producer/
│ │ ├── simstatus/ # 卡状态全量同步
│ │ ├── monthlyusage/ # 本月流量全量同步
│ │ ├── dailyusage/ # 日流量全量同步
│ │ ├── monthlyusagehistory/ # 月流量历史同步
│ │ └── imei/ # IMEI 全量同步
│ ├── fullsync/ # 全量同步运行时、归档、契约、HTTP 诊断
│ ├── service/ # 各业务动作执行器
│ ├── repository/ # 数据访问
│ ├── queue/zset/ # 任务队列与锁
│ └── library/rabbitmq/ # MQ 封装
├── config/ # 配置
├── build/ # Dockerfile 与镜像内配置
├── manifest/deploy/kustomize/ # K8s 部署清单
└── manifest/docker/ # compose 与启动脚本
```
## 全量同步模型
```text
Producer(扫描卡 → 按通道分片入队)
│
▼
ZSet 任务队列(Redis)
│
▼
Consumer(按通道 QPS 领取 → 调上游 → 写库 → 结算)
│
▼
运行归档(终态 JSON,供 Bot 通知与排障)
```
关键设计:
- **通道隔离**:每个通道独立并发与 QPS,一个慢通道不拖垮其他通道
- **供料与消费解耦**:Producer 只负责入队,Consumer 按节奏领取,避免上游被瞬时打满
- **多轮重试**:单卡失败进入下一轮,轮次上限与单轮上限均可配
- **归档去重**:按 `runId` 标识一次执行,Bot 据此去重推送
## 容器化构建
```bash
docker build -f build/Dockerfile -t iotlcm-worker-svr:latest .
```
镜像内不含任何凭据;`config/config.yaml` 以只读方式挂载覆盖。
## 测试
```bash
go test ./...
```
测试使用本地替身,不访问真实运营商接口。
> **已知失败(与上游主分支一致,非本仓引入)**:
> `TestValidateUpstreamBasicInfoAcceptsMatchingIdentifiers`、
> `TestConfiguredInboundBasicInfoClientUsesDedicatedEndpoint`、
> `TestAllocateProcessingRetryAfterHasLargeBatchDefault`。
> 这三项在源仓库同一提交上同样失败,属既有缺陷。
## 相关项目
- [iotlcm-bot](https://git.5iot.com/iotlcm-public/iotlcm-bot) —— 读取归档 JSON 并推送飞书卡片
- [iotlcm-upstream-chan](https://git.5iot.com/iotlcm-public/iotlcm-upstream-chan) —— 运营商上游适配
- [iotlcm-admin-svr](https://git.5iot.com/iotlcm-public/iotlcm-admin-svr) —— 管理后台(发起批次与定时任务)
## License
[Apache License 2.0](./LICENSE)