TMS运输管理系统架构介绍

基于现代化技术构建的高效、可靠、可扩展的运输管理解决方案

系统概述

TMS运输管理系统是一个综合性的物流管理平台,整合了订单管理、运输调度、货物跟踪、网点管理、财务管理等核心功能,为物流企业提供全方位的数字化解决方案。

系统采用模块化设计,支持多角色协同工作,包括客户端、网点端、分拣员端、运输员端、派送员端和管理员端,实现物流全流程的数字化管理。

业务流程图

用户下单
↓
收货网点
↓
运输调度
↓
分拣中心
↓
货物运输
↓
配送网点
↓
派送员派送
↓
用户签收

系统架构

表现层
客户端
网点端
分拣员端
运输员端
派送员端
管理员端
↓
业务逻辑层
订单管理
运输调度
货物跟踪
网点管理
财务管理
人力资源管理
↓
数据访问层
数据访问接口
缓存管理
数据同步
↓
数据存储层
关系型数据库
NoSQL数据库
文件存储

网络架构与集群部署

网络架构图

客户端

APP/PC/小程序

Android iOS Web WeChat
↓
CDN & 安全层

全球加速 & 安全防护

CDN节点 WAF防护 DDoS防护
↓
Nginx集群

3节点负载均衡

Nginx-1 Nginx-2 Nginx-3
↓
Gateway集群

3节点API网关

Gateway-1 Gateway-2 Gateway-3
↓
Nacos集群

3节点注册中心

Nacos-1 Nacos-2 Nacos-3
↓
订单服务

3节点集群

Order-1 Order-2 Order-3
客户端服务

3节点集群

Client-1 Client-2 Client-3
运输服务

3节点集群

Transport-1 Transport-2 Transport-3
网点服务

3节点集群

Branch-1 Branch-2 Branch-3
检索服务

3节点集群

Search-1 Search-2 Search-3
TMS服务

3节点集群

TMS-1 TMS-2 TMS-3
↓
认证服务

3节点集群

Auth-1 Auth-2 Auth-3
消息服务

3节点集群

MQ-1 MQ-2 MQ-3
监控服务

3节点集群

Monitor-1 Monitor-2 Monitor-3
日志服务

3节点集群

Log-1 Log-2 Log-3
↓
缓存集群

多级缓存架构

Redis Master-1 Redis Slave-1 Redis Master-2 Redis Slave-2 Redis Master-3 Redis Slave-3
↓
存储服务
MySQL分库分表

主从复制架构

YN_Master SX_Master GD_Master SC_Master
ElasticSearch

6节点集群

ES-Master ES-Data1 ES-Data2 ES-Data3
对象存储

分布式存储

OSS-1 OSS-2 OSS-3
↓
运维监控

统一监控平台

Prometheus Grafana ELK Stack Jenkins

集群介绍

1. 客户端层
  • 多端支持:APP、PC、小程序三端覆盖,满足不同用户场景
  • 负载均衡:通过DNS轮询和Nginx实现客户端请求分发
  • CDN加速:静态资源通过CDN分发,提升访问速度
2. 接入层
  • Nginx集群:部署多节点Nginx,实现高可用和负载均衡
  • SSL/TLS:全链路HTTPS加密,保障数据传输安全
  • 限流熔断:实现请求限流和熔断机制,保护后端服务
3. 网关层
  • Gateway集群:基于Spring Cloud Gateway的API网关集群
  • 路由管理:动态路由配置,支持服务灰度发布
  • 统一认证:集中式身份认证和授权管理
  • 监控告警:实时监控网关健康状态和请求流量
4. 服务层
  • Nacos服务发现:实现服务注册与发现,支持动态扩缩容
  • 服务集群:各微服务独立部署3节点集群,提高可用性
  • 负载均衡:基于Ribbon的客户端负载均衡
  • 服务治理:通过Sentinel实现服务熔断、限流和降级
5. 核心服务介绍
  • 订单服务(Order Service):
    • 订单创建、修改、取消等全生命周期管理
    • 订单状态流转和通知
    • 订单数据分库分表处理
  • 客户端服务(Client Service):
    • 用户注册、登录、认证授权
    • 用户信息管理和积分管理
    • 收货地址管理
  • 运输服务(Transport Service):
    • 运输路线规划和调度
    • 车辆和司机管理
    • 运输过程跟踪和监控
  • 网点服务(Branch Service):
    • 网点信息管理和查询
    • 网点能力评估(到货、派送能力)
    • 网点库存和出入库管理
  • 检索服务(Search Service):
    • 基于ElasticSearch的全文检索
    • 订单、货物、网点等多维度搜索
    • GIS地理位置检索和路线规划
    • 实时索引更新和缓存优化
  • TMS服务(TMS Service):
    • TMS核心业务逻辑处理
    • 分拣、装卸、发车等业务流程管理
    • 考核、绩效、运单等核心功能
    • 与其他服务的业务协调和数据同步
6. 存储层
  • Redis集群:部署6节点哨兵模式,3主3从,提供高性能缓存
  • MySQL主从:16库主从复制架构,每个库1主2从,实现读写分离
  • 数据库分片:根据业务需求实现水平分片,提高存储容量和性能
  • 数据备份:定期全量备份和增量备份,保障数据安全
7. 运维监控
  • Prometheus监控:实时监控系统各项指标
  • Grafana可视化:直观展示系统运行状态
  • ELK日志系统:集中式日志收集和分析
  • 自动化部署:基于Jenkins的CI/CD流程

客户端架构

多端支持
APP端
PC端
小程序端
↓
核心功能
下单功能
订单查询
网点搜索
网点能力查询(可到货、可派送)

订单系统

订单管理

  • 订单提取:从队列中提取待处理订单,分配给相应网点或运输员
  • 订单修改:支持订单信息修改,包括收货人、地址、货物信息等
  • 运费计算:根据距离、重量、体积等自动计算运费
  • 服务费管理:支持增值服务费用,如保价费、加急费等
  • 支付管理:支持在线支付、货到付款、月结等多种支付方式

积分与优惠

  • 积分扣除:下单时可使用积分抵扣运费,积分实时扣除
  • 网点折扣:支持网点折扣策略,不同网点可设置不同折扣率
  • 修改通知:订单状态变更时自动通知用户,包括短信、APP推送等

TMS核心系统

运输管理

  • 运输调度:智能分配运输任务,优化运输路线
  • 运输跟踪:实时跟踪运输车辆位置和货物状态
  • 运输监控:监控运输过程中的异常情况,及时预警

考核管理

  • 绩效考核:对运输员、派送员进行绩效评估
  • 考核指标:包括准时率、完好率、客户满意度等
  • 考核报表:生成考核报表,支持多维度分析

货箱管理

  • 货箱创建:创建货箱,绑定货物信息
  • 货箱跟踪:跟踪货箱流转状态
  • 货箱盘点:定期盘点货箱库存

转运管理

  • 转运调度:安排货物在网点间的转运
  • 转运跟踪:跟踪转运进度和状态
  • 转运确认:确认货物到达转运网点

订单运营

  • 订单分配:将订单分配给合适的运输员或派送员
  • 订单监控:监控订单处理进度
  • 异常处理:处理订单异常情况

车辆管理

  • 车辆信息:管理车辆基本信息、证件、保险等
  • 车辆调度:安排车辆执行运输任务
  • 车辆维护:记录车辆维护、保养信息

绩效管理

  • 绩效统计:统计员工工作量和效率
  • 绩效排名:生成员工绩效排名
  • 绩效奖励:根据绩效发放奖励

装卸管理

  • 装卸计划:制定装卸作业计划
  • 装卸记录:记录装卸作业情况
  • 装卸确认:确认装卸完成

分拨管理

  • 分拨调度:安排货物分拨到不同网点
  • 分拨跟踪:跟踪分拨进度
  • 分拨确认:确认分拨完成

扫描管理

  • 入库扫描:扫描货物入库
  • 出库扫描:扫描货物出库
  • 转运扫描:扫描货物转运

运单管理

  • 运单生成:自动生成运单
  • 运单打印:支持运单打印
  • 运单查询:查询运单信息

到货管理

  • 到货登记:登记货物到达网点
  • 到货确认:确认货物到货
  • 到货通知:通知相关人员到货

发车管理

  • 发车计划:制定发车计划
  • 发车确认:确认车辆发车
  • 发车跟踪:跟踪发车状态

入库记录

  • 入库登记:登记货物入库
  • 入库确认:确认入库完成
  • 入库统计:统计入库数据

数据库架构

分库策略

  • 按省份ID分库:根据订单所属省份ID进行分库,将不同省份的订单数据存储在不同的数据库实例中,实现数据的地域隔离和负载分散
  • 分库数量:根据业务量和地域分布,建议设置8-16个数据库实例,每个实例负责1-3个省份的数据
  • 优势:提高系统可用性,单库故障不影响其他地区业务;便于按地区进行数据备份和恢复

分表策略

订单表(orders)
  • 分表依据:按省份ID分表,与分库策略保持一致
  • 数据量估算:每个表约有800w数据(计算公式:100000单/天 * 320天/年 * 4年 / 16库 = 800w)
  • 分表数量:每个数据库实例分4-8个表,根据实际数据量动态调整
  • 索引策略:订单ID(主键)、用户ID、网点ID、订单时间、订单状态
2.订单货物详情表(order_goods)
  • 分表依据:与订单表保持一致,按省份ID分表,确保订单和货物在同一数据库实例中
  • 数据量估算:每个表约有4000w数据(计算公式:800w订单 * 5件货物/订单 = 4000w)
  • 存储内容:每个订单对应一种类型多个货物的详细信息
  • 索引策略:货物ID(主键)、订单ID(外键)、货物类型、货物状态
3. 运单扫描记录表(waybill_scan)
  • 分表依据:按订单时间按月分表,便于数据清理和归档
  • 数据量估算:每个表约有500w数据(计算公式:100000单/天 * 5次扫描/单 * 30天 = 1500w,考虑扫描记录较多,估算500w)
  • 数据清理:清除6个月之前的数据,归档到历史数据库或冷存储
  • 索引策略:扫描ID(主键)、订单ID、扫描时间、扫描状态、扫描网点
4. 用户订单关联表(user_order)
  • 分表依据:按用户ID分表,确保同一用户的订单记录在同一表中
  • 数据量估算:每个表约有1000w数据(计算公式:总用户数 * 平均订单数 / 表数量)
  • 存储内容:记录下单用户、网点信息、订单ID、地区信息和签收用户信息
  • 索引策略:关联ID(主键)、用户ID、订单ID、下单时间、订单状态
5. 其他基础表
  • 用户表(users):存储用户基本信息,按用户ID分表
  • 网点表(branches):存储网点基本信息,按省份ID分表
  • 车辆表(vehicles):存储车辆基本信息,按网点ID分表
  • 员工表(employees):存储员工基本信息,按网点ID分表

分表后带来的问题及解决方案

1. 如何根据订单号定位查询订单详情、货物信息和扫描记录?
  • 订单号设计:采用标准化格式,长度16位,格式为:地区码(2位) + 年份(2位) + 序号(12位),如YN24000000000001
  • 地区码映射:建立地区码到数据库实例的映射表,如YN→db_instance_1, SX→db_instance_2
  • 定位流程:
    • 从订单号前2位提取地区码(如YN)
    • 根据地区码映射表确定对应的数据库实例
    • 从订单号解析出年份和序号信息
    • 根据序号计算分表位置(序号 % 表数量)
    • 根据年份和月份确定扫描记录表的分表
    • 在同一数据库实例中查询订单详情、货物信息和扫描记录
  • 性能优化:使用Redis缓存订单号到数据库实例的映射关系,减少映射表查询
2. 如何查询某用户或某网点的所有订单记录?
  • 解决方案:
    • 多级关联表设计:
      • 用户订单关联表(user_order_mapping):按用户ID分表,记录用户ID、订单ID、地区信息、订单时间、订单状态
      • 网点订单关联表(branch_order_mapping):按网点ID分表,记录网点ID、订单ID、地区信息、订单时间、订单状态
      • 订单索引表(order_index):按时间分表,记录订单基本信息和状态,用于快速查询
    • 分布式查询服务:
      • 查询路由:根据用户ID或网点ID路由到对应的数据分片
      • 并行执行器:同时执行多个数据库实例的查询
      • 结果聚合器:汇总和排序查询结果
    • 智能缓存策略:
      • L1缓存:Redis本地缓存,存储热点用户的订单列表
      • L2缓存:分布式Redis缓存,存储用户最近的订单记录
      • 缓存预热:系统启动时预热活跃用户的订单数据
      • 缓存失效策略:基于时间和访问频率的智能失效
  • 查询流程:
    • 第一步:缓存查询
      • 查询Redis本地缓存,检查是否存在热点用户的订单列表
      • 若缓存命中,直接返回缓存结果
    • 第二步:关联表查询
      • 根据用户ID或网点ID计算分表位置
      • 查询对应的关联表,获取订单ID和地区信息
      • 应用时间范围、订单状态等过滤条件
    • 第三步:分布式查询
      • 根据地区信息分组,确定需要查询的数据库实例
      • 使用线程池并行查询多个数据库实例
      • 每个查询使用主从负载均衡,优先选择从库
    • 第四步:结果处理
      • 汇总来自不同数据库实例的查询结果
      • 按时间戳排序,支持正序和倒序
      • 应用分页逻辑,返回指定页的数据
      • 将结果缓存到Redis,设置合理的过期时间
  • 高级优化策略:
    • ElasticSearch集成:
      • 实时同步订单数据到ElasticSearch
      • 支持全文检索、模糊查询、范围查询等复杂条件
      • 提供聚合分析功能,如按时间、地区、状态统计
      • 使用ES作为复杂查询的主数据源,数据库作为详细信息来源
    • 数据分片优化:
      • 用户订单关联表:按用户ID范围分片,每100万用户一个分片
      • 网点订单关联表:按网点ID范围分片,每1000个网点一个分片
      • 使用一致性哈希算法,支持动态扩缩容
    • 读写分离增强:
      • 写操作:路由到主库
      • 读操作:智能路由到负载较低的从库
      • 延迟敏感查询:使用主库
      • 批量查询:使用从库
    • 监控与告警:
      • 监控查询响应时间、QPS、错误率等指标
      • 设置阈值告警,当查询时间超过阈值时及时通知
      • 慢查询日志分析,定期优化查询语句
      • 缓存命中率监控,及时调整缓存策略
    • 降级策略:
      • 当ElasticSearch不可用时,降级为直接查询数据库
      • 当缓存失效时,使用异步加载策略,避免阻塞主线程
      • 当数据库负载过高时,启用限流和排队机制
  • 扩展性考虑:
    • 支持水平扩展:当数据量增长时,可以添加更多的数据库实例
    • 支持垂直扩展:当单实例性能不足时,可以升级硬件配置
    • 支持跨区域部署:可以在不同区域部署数据库实例,提高访问速度
    • 支持多租户:可以为不同的客户或业务线提供独立的数据分片
3. 跨库事务处理
  • 问题:分库后,单个业务可能涉及多个数据库实例,传统事务无法满足需求
  • 解决方案:
    • 使用分布式事务框架(如Seata)保证数据一致性
    • 采用最终一致性方案,通过消息队列实现异步数据同步
    • 将业务逻辑设计为幂等性,支持重试机制

数据库优化策略

1. 读写分离
  • 主从架构:每个数据库实例配置1主2从,主库负责写操作,从库负责读操作
  • 负载均衡:使用中间件(如ShardingSphere、MyCat)实现读写分离和负载均衡
  • 数据同步:主从复制采用半同步模式,确保数据一致性
2. 缓存策略
  • 热点数据缓存:使用Redis缓存热点订单、用户信息、网点信息等
  • 缓存穿透防护:使用布隆过滤器防止缓存穿透
  • 缓存雪崩防护:设置不同的过期时间,避免同时失效
  • 缓存更新策略:采用Cache-Aside模式,写操作先更新数据库再删除缓存
3. 索引优化
  • 联合索引:根据查询频率和选择性,合理设计联合索引
  • 索引覆盖:尽量使用索引覆盖查询,避免回表
  • 索引监控:定期监控索引使用情况,删除无用索引

运维与容灾

1. 数据迁移与扩容
  • 平滑扩容:采用双写方案,新数据同时写入新旧表,历史数据异步迁移
  • 数据校验:迁移完成后进行数据一致性校验,确保数据无误
  • 灰度切换:逐步将流量切换到新表,出现问题可快速回滚
2. 备份与恢复
  • 全量备份:每周进行一次全量备份,存储到异地备份中心
  • 增量备份:每天进行增量备份,减少备份时间和存储空间
  • 恢复演练:定期进行恢复演练,验证备份的有效性
3. 监控与告警
  • 性能监控:监控数据库QPS、响应时间、慢查询等指标
  • 容量监控:监控磁盘使用率、表数据量,提前预警扩容需求
  • 异常告警:设置告警阈值,及时发现和处理异常情况

定时任务

订单超时处理
订单超时检测
自动取消
通知用户
↓
运输调度
路线优化
车辆分配
发车计划
↓
数据统计
日/周/月报表
KPI指标计算
异常数据检测

检索任务

数据索引
订单数据索引
网点数据索引
货物数据索引
↓
检索服务
全文检索
地理位置检索
多维度过滤
↓
结果处理
结果排序
聚合分析
缓存结果

技术栈

前端技术

Vue3 + TypeScript + Vite + Element Plus

后端技术

Spring Boot + Spring Cloud + MyBatis Plus

数据库

MySQL + Redis + ElasticSearch

部署

Docker + Kubernetes + Nginx

安全

Spring Security + JWT + OAuth2

监控

Prometheus + Grafana + ELK