2. 环境规划与架构设计:整体技术栈选型与网络拓扑
本章聚焦于支撑“批次追溯数据在材料申请流程”的底层基础设施与架构决策。一个高可用的追溯系统,必须从数据库、消息队列、应用服务器三个核心层面进行严谨选型,并设计清晰的网络拓扑与灾备策略。以下内容将直接指导后续章节的部署与配置实战。
2.1 整体技术栈选型
技术栈的选型遵循“生产级可用、社区活跃、运维成本可控”的原则。针对批次追溯场景中高频的写入(批次入库)与查询(材料申请追溯),我们采用以下组合:
| 层级 | 技术组件 | 版本建议 | 选型理由 |
|---|---|---|---|
| 数据库 | PostgreSQL + TimescaleDB 扩展 | PostgreSQL 15+ / TimescaleDB 2.12+ | 原生支持时序数据分区,批次追溯数据天然带时间戳;强大的 JSONB 支持存储批次属性;流复制实现高可用。 |
| 消息队列 | RabbitMQ | 3.12+ | 支持死信队列、延迟消息(用于批次过期提醒);AMQP 协议成熟,与 Spring Boot 集成度高;集群模式满足高可用。 |
| 应用服务器 | Tomcat (内嵌于 Spring Boot) + Nginx | Tomcat 10 / Nginx 1.24+ | Spring Boot 内嵌 Tomcat 简化部署;Nginx 作为反向代理与负载均衡,处理 SSL 终结与静态资源缓存。 |
| 缓存 | Redis | 7.0+ | 缓存批次基础信息与频繁查询的追溯路径,降低数据库压力;使用 Redis Cluster 或 Sentinel 保障高可用。 |
选型提示: 如果团队对时序数据库运维经验不足,可退化为 PostgreSQL 原生分区表 + 定期清理策略。但 TimescaleDB 的自动分区与压缩功能,在批次数据量超过 5000 万行时优势明显。
2.2 网络拓扑设计
网络拓扑采用经典的三层架构:接入层、应用层、数据层。所有内部服务调用均通过内网 VLAN 隔离,禁止数据库与消息队列直接暴露在公网。
网络隔离要点:
- 接入层:Nginx 只开放 443 端口,配置 IP 白名单与频率限制。
- 应用层:应用节点只对内网开放 8080 端口,通过 Nginx upstream 进行健康检查。
- 数据层:PostgreSQL 监听内网 IP,pg_hba.conf 只允许应用层网段访问;RabbitMQ 管理端口(15672)仅限运维跳板机访问。
2.3 高可用与灾备策略
批次追溯数据一旦丢失将导致供应链合规风险,因此高可用与灾备必须覆盖所有核心组件。我们采用“同城双活 + 异地灾备”的混合策略。
2.3.1 各组件高可用方案
| 组件 | 高可用模式 | 切换时间 RTO | 数据丢失 RPO |
|---|---|---|---|
| PostgreSQL | 流复制(1主2从)+ Patroni 自动故障转移 | < 30 秒 | < 1 秒(同步复制) |
| RabbitMQ | 镜像队列集群(3节点) | < 10 秒 | 0(队列内消息不丢失) |
| Redis | Redis Sentinel 或 Cluster(3主3从) | < 15 秒 | < 1 秒(AOF + 主从同步) |
| Nginx | Keepalived + 虚拟 IP(主备模式) | < 5 秒 | 无状态,不涉及数据丢失 |
2.3.2 灾备策略
灾备分为两个层级:同城灾备与异地灾备。同城灾备用于应对机房级故障,异地灾备用于应对区域性灾难。
- 同城灾备:在同一个城市的不同可用区部署一套完整的从库与消息队列节点。PostgreSQL 采用异步流复制,RPO 控制在 5 秒以内。RabbitMQ 通过 Shovel 或 Federation 插件跨可用区同步消息。
- 异地灾备:在距离主中心 500 公里以上的地域部署一套冷备环境。每天凌晨通过 pg_dump 进行全量备份,并归档 WAL 日志到对象存储(如 MinIO)。灾备切换时,需要手动拉起数据库并恢复最近一次全量备份 + WAL 回放。
灾备演练提醒: 每季度至少执行一次灾备切换演练。重点验证:1) Patroni 是否能在 30 秒内选举新主库;2) 应用连接池是否自动切换到新主库;3) 异地灾备的 WAL 回放时间是否在可接受范围内(建议不超过 2 小时)。
2.4 环境规划清单
在进入具体部署前,请根据下表核对环境资源是否就绪:
| 资源类型 | 规格要求 | 数量 | 备注 |
|---|---|---|---|
| 虚拟机 / 物理机 | 8 vCPU / 32 GB RAM / 500 GB SSD | 6 台 | 3 台用于应用 + 中间件,3 台用于数据库集群 |
| 网络 | 内网千兆,公网带宽 ≥ 100 Mbps | 1 个 VLAN | 应用层与数据层严格隔离 |
| 存储 | SSD 持久化卷,IOPS ≥ 3000 | 3 块 | 数据库主库独立挂载,从库可共用 |
| 域名 & 证书 | 泛域名 SSL 证书 | 1 张 | 用于 Nginx 反向代理 |