系统架构总览:分层架构设计

做抢单机器人这几年,我最大的感触就是——架构设计决定了你能走多远。刚开始我写过一个单体应用,所有逻辑揉在一起,结果业务量一上来,改一个功能要重启整个服务,用户那边抢单慢了半秒,订单就飞了。后来我彻底重构,采用了经典的三层架构。

说白了,分层架构就是把系统拆成三个独立的层:接入层、业务层、数据层。每一层各司其职,互不干扰。你想想看,这样做的好处是什么?

  • 接入层:只负责跟外部打交道,比如接收用户请求、校验参数、做限流
  • 业务层:只处理核心逻辑,比如抢单算法、订单分配、风控判断
  • 数据层:只关心数据怎么存、怎么取,比如读写分离、缓存策略

我在项目中遇到过最典型的坑:有人把业务逻辑写到了数据库存储过程里。结果换数据库厂商时,所有存储过程都得重写,那叫一个痛苦。所以记住,层与层之间只能通过接口通信,千万别越界。

核心原则:每一层只做自己该做的事,上层依赖下层,下层不感知上层。

接入层设计

接入层是系统的门面。用户的所有请求都先打到这一层。我习惯把它拆成两个子模块:

  • 网关模块:负责路由转发、身份认证、限流熔断。我常用 Nginx + OpenResty 做反向代理,配合 Lua 脚本做动态限流
  • 协议适配模块:处理不同的通信协议,比如 HTTP、WebSocket、TCP。抢单场景下,WebSocket 是标配,因为延迟低

嗯,这里要注意:接入层不要做任何业务判断。我曾经见过有人把抢单规则写在网关层,结果改规则还得重启网关,太蠢了。

避坑指南:我曾经在接入层直接操作数据库查用户信息,导致数据库连接池被网关占满。正确的做法是,接入层只做透传,把请求原封不动扔给业务层。

业务层设计

业务层是整个系统的大脑。所有复杂的逻辑都在这里完成。我把它分成四个核心模块:

模块名称 职责 关键点
抢单引擎 处理抢单请求,执行分配算法 高并发、低延迟、防重复
订单管理 订单生命周期管理 状态机、超时处理
用户中心 用户信息、权限、信用分 缓存策略、数据一致性
风控模块 检测异常行为、防刷单 规则引擎、实时计算

抢单引擎是重中之重。我设计时用了事件驱动架构:用户发起抢单请求后,引擎把请求封装成事件,扔到消息队列里,然后异步处理。这样做的好处是,系统能扛住瞬间的流量洪峰。

举个例子:假设有 1000 个人同时抢一个订单。如果同步处理,数据库瞬间就炸了。但用事件驱动,请求先排队,引擎逐个处理,数据库压力就小很多。

警告:业务层一定要做幂等处理。我遇到过因为网络重试导致同一个订单被分配两次的惨案。解决方案很简单:每个请求带一个全局唯一 ID,业务层根据 ID 去重。

数据层设计

数据层是系统的基石。抢单场景下,数据读写非常频繁,而且对一致性要求极高。我通常这样分层:

  • 缓存层:Redis 为主,存储热点数据,比如订单状态、用户信息。缓存命中率要保持在 95% 以上
  • 持久层:MySQL 做主力存储,分库分表是标配。我习惯按订单 ID 哈希分 64 个库,每个库再分 16 张表
  • 消息队列:Kafka 或 RocketMQ,用于异步解耦。比如抢单成功后,发一条消息通知用户中心更新数据

你可能会问:为什么不用 MongoDB?我个人习惯是,抢单场景对事务要求高,MySQL 的 ACID 特性更靠谱。MongoDB 适合日志、监控这类非核心数据。

数据层核心策略:

  • 读写分离:主库写,从库读,降低锁竞争
  • 缓存穿透防护:布隆过滤器拦截无效请求
  • 最终一致性:允许短暂不一致,但必须保证最终数据正确

技术选型概览

技术选型没有银弹。我根据自己踩过的坑,整理了一套比较成熟的方案:

层级 技术栈 选型理由
接入层 Nginx + OpenResty + Lua 高性能、可编程、生态成熟
业务层 Spring Boot + Netty Java 生态完善,Netty 处理高并发 IO
数据层 Redis + MySQL + Kafka 缓存、持久化、消息队列三件套
监控 Prometheus + Grafana 实时监控、告警、可视化
部署 Docker + Kubernetes 容器化、弹性伸缩、运维省心

为什么选 Spring Boot?因为我团队里 Java 工程师多,而且 Spring 的生态确实强大。如果你团队擅长 Go,用 Gin 框架也行。技术选型要结合团队实际情况,别盲目追新。

个人建议:消息队列别用 RabbitMQ,抢单场景下吞吐量不够。Kafka 的吞吐量是 RabbitMQ 的 10 倍以上,而且支持分区消费,非常适合高并发场景。

架构总览图

下面这张图是我手绘的架构总览,你可以看到三层之间的调用关系:

接入层 Nginx 网关 协议适配 限流熔断 HTTP/WebSocket 业务层 抢单引擎 订单管理 用户中心 风控模块 RPC/消息队列 数据层 Redis 缓存 MySQL 分库分表 Kafka 消息队列

从图里可以清楚看到:用户请求先经过接入层,然后路由到业务层处理核心逻辑,最后业务层调用数据层读写数据。每一层之间通过 HTTP、RPC 或消息队列通信,完全解耦。

模块划分总结

最后,我把模块划分的核心要点总结一下:

  • 接入层:网关 + 协议适配 + 限流,不沾业务逻辑
  • 业务层:抢单引擎 + 订单管理 + 用户中心 + 风控,核心逻辑集中
  • 数据层:缓存 + 持久化 + 消息队列,保证数据可靠

这套架构我用了三年,支撑过日均百万级的抢单请求。当然,没有完美的架构,只有适合业务的架构。你如果刚开始做,可以先从单体应用起步,等业务量上来再逐步拆分。别一上来就搞微服务,那是在给自己挖坑。

一句话总结:分层架构的核心是「高内聚、低耦合」。每一层做好自己的事,别越界,系统自然稳定。

专注资料整理