
简介: 做商城小程序,表面是选模板,本质是技术架构决策。本文从架构、技术栈、数据库建模、支付幂等、秒杀并发、多端同步、安全运维七个工程维度,系统对比 SaaS 多租户、独立部署(含外包定制)、完全自研三种方案,并给出可直接对照的技术选型矩阵,帮你判断哪种方案与团队的技术能力、预算和上线周期匹配。
一、为什么"做商城小程序"首先是技术问题
很多人把做商城小程序理解成"选个模板、填几个商品",但真正上线后,决定系统能不能用的是一系列技术问题:
- 商品、订单、库存、会员数据怎么建模,秒杀时会不会超卖?
- 支付、退款、回调如何保证幂等,不重复扣款、不重复发货?
- 大促流量上来后,接口和数据库扛不扛得住?
- 小程序、H5、PC 多端数据如何同步?
- 系统谁来维护,出问题多久能恢复?
这些问题在三种主流方案里答案完全不同:SaaS 多租户平台、独立部署(含外包定制)、完全自研。本文从架构、技术栈、数据库、支付、并发、运维六个工程维度做对比,帮你判断哪种方案与团队的技术能力匹配。
二、三种方案的架构本质
1. SaaS 多租户
所有商家共用一套代码和基础设施,通过租户隔离区分数据。你拿到的是一个已经运行的系统,注册后即可配置使用。
┌─────────────── 统一的应用集群 ───────────────┐
│ 商家A(租户) 商家B(租户) 商家C(租户) │
└───────────────────────────────────────────┘
│ │ │
└──── 共享服务:商品/订单/支付/营销 ────┘
共享数据库(租户字段隔离)
- 优点:开箱即用、无需运维、功能由平台持续迭代;
- 缺点:定制化受平台能力边界限制,深度个性化需求难以满足。
2. 独立部署 / 外包定制
拿到一套系统的部署权(或外包团队为你定制),代码和数据库独立部署在你自己的服务器上。
- 优点:数据完全独立、可二次开发;
- 缺点:需要服务器、运维和开发能力,升级、安全补丁都要自己跟。
3. 完全自研
从需求、设计、前后端开发到运维全部自己掌控。
- 优点:灵活度最高,可完全贴合业务;
- 缺点:投入最大、周期最长,需要一个完整的研发团队。
三、技术栈对比
| 层 | SaaS | 独立部署 | 自研 |
|---|---|---|---|
| 前端 | 小程序/H5/PC 由平台提供,可视化配置 | 常见 uni-app / Taro / 原生小程序 | 自由选型,可多端统一 |
| 后端 | 平台统一(Java/Go/Node 均有可能) | 常见 Spring Boot/ThinkPHP/Node,部署在阿里云 ECS | 自由选型 |
| 数据库 | 平台托管 | 阿里云 RDS MySQL/PostgreSQL(高可用版) | 自由选型,可分库分表 |
| 缓存 | 平台托管 | 阿里云 Redis 版 | Redis 集群 |
| 消息队列 | 平台托管 | RabbitMQ/RocketMQ | 按需搭建 |
| 部署 | 无需关心 | SLB + Nginx + ECS | 容器化/K8s |
| 运维 | 平台负责 | 自行或外包负责 | 专职运维 |
对技术团队的要求:SaaS 基本为零;独立部署需要能看懂代码、会部署和排查问题的人;自研需要前端、后端、测试、运维完整配置。
四、数据库设计要点
无论哪种方案,电商的核心数据模型是相通的,至少包含以下实体:
用户/会员(User) ──< 订单(Order) >── 订单明细(OrderItem)
│
商品(Product) ──< SKU(规格) ── 库存(Stock)
营销活动(Promotion) ── 优惠券(Coupon)
收货地址(Address)、支付流水(Payment)、退款单(Refund)
几个关键设计点:
- 商品与 SKU 分离:一个商品(SPU)有多个规格(SKU),价格、库存挂在 SKU 上,而不是 SPU 上。
- 订单与库存分离:下单锁库存、支付扣库存,要明确策略,避免超卖。
- 支付流水与订单分离:一笔订单可能对应多次支付尝试(支付失败重试),用独立流水表记录。
- 软删除 + 审计字段:订单、支付数据不做物理删除,保留创建/更新时间和操作记录。
SaaS 平台已经实现了这些模型;自研时则需要团队对电商业务有足够理解,否则容易在库存、价格等环节留下隐患。
五、支付与幂等:最容易出事故的环节
支付是电商系统的技术核心,关键在于幂等和对账。
1. 下单与支付的幂等
用户网络不好时可能重复点击、重复发起支付。正确做法是:
- 下单接口用唯一请求号(或前端按钮置灰 + 防重 token),同一请求只创建一笔订单;
- 支付结果以异步回调为准,回调接口必须幂等:同一笔回调重复到达,只处理一次;
- 用订单状态机控制流转:
待支付 → 已支付 → 待发货 → 已发货 → 已完成,不允许逆向跳变。
支付回调到达
│
├─ 订单已处理?──是──> 直接返回 success(幂等)
│
└─ 否:校验金额 → 更新订单状态 → 扣库存 → 发通知 → 返回 success
2. 退款
退款同样要有独立单据和状态机,防止重复退款;退款金额不能超过订单实付金额。
3. 交易费率
技术上还要关注支付通道费率,这是平台帮你申请还是自己对接。不同通道、不同主体的费率不同,需要在成本模型里算清楚。
六、并发与秒杀:超卖问题
秒杀、拼团是营销常用功能,也是最容易压垮系统的环节。核心是库存不超卖。
1. 数据库层面
最简单的乐观锁:
UPDATE stock SET quantity = quantity - 1
WHERE sku_id = ? AND quantity > 0;
通过 quantity > 0 条件保证不超卖,返回影响行数为 0 即已售罄。
2. 缓存层面
高并发时先用 Redis 预扣库存(DECR),挡住大部分请求,再异步落库;下单失败要回滚预扣库存。
3. 限流与削峰
- 接口限流(令牌桶/漏桶);
- 用消息队列把下单请求排队,削平流量尖峰;
- 静态资源(商品图、详情页)走 CDN,减少源站压力。
SaaS 平台的秒杀能力由平台统一保障;自研时这套缓存、队列、限流方案需要团队自己搭建,是工程量最大的部分之一。
七、多端同步
很多商家需要同时做小程序、H5 和 PC 商城。三种方案的多端策略不同:
- SaaS:看版本,有的平台三端合一(一套后台、多端同步),有的版本三端选一,选购时要确认清楚;
- 独立部署:看代码是否用 uni-app 等跨端框架,一套代码多端发布;
- 自研:可统一用跨端框架,也可各端独立开发,灵活但成本高。
多端的核心是后台数据统一,前端只是不同的展示层;订单、库存、会员必须在同一套后端上,避免各端数据不一致。
八、安全、合规与运维
- 鉴权:用户登录态用 token(JWT/Session),接口做权限校验;后台管理接口单独鉴权。
- 数据安全:手机号、地址等敏感信息加密存储或脱敏展示;传输全程 HTTPS。
- 合规:小程序发布需主体认证;分销类功能注意合规,避免违规的多层级分销模式。
- 备份:数据库定期备份,关键操作有日志,出问题可恢复。
- 监控:接口耗时、错误率、服务器资源要有监控告警。
SaaS 由平台承担安全、备份、监控;独立部署和自研则需要自己建立这套体系。
九、选型决策矩阵(技术视角)
| 维度 | SaaS | 独立部署 | 自研 |
|---|---|---|---|
| 上线周期 | 最快(天级) | 数周 | 数月起 |
| 初期投入 | 低(年付订阅) | 中(服务器+开发) | 高(团队) |
| 定制能力 | 受平台边界限制 | 较高 | 最高 |
| 运维负担 | 无 | 中 | 高 |
| 数据独立性 | 平台托管 | 独立 | 独立 |
| 适合团队 | 无技术团队 | 有 1~2 名开发 | 完整研发团队 |
| 主要风险 | 需求超出平台能力 | 维护断档 | 投入超预期 |
决策建议:
- 没有技术团队、业务是标准电商(卖货、营销、会员):优先 SaaS,把精力放在运营而非开发;
- 有少量开发、业务有一定个性化:评估独立部署,确认能否持续维护;
- 业务模式非常特殊、有成熟研发团队:再考虑自研。
一个实用的判断方法:先列清自己的"必须有"功能清单,再去对照方案能否覆盖。大多数中小商家的需求都在标准电商范围内,SaaS 能覆盖 80% 以上;只有出现深度定制的业务流程时,独立部署或自研才值得。
十、常见问题
Q:SaaS 平台的数据安全吗,会不会被平台锁死?
A:正规平台有数据隔离和备份机制。选型时确认是否支持导出商品、订单数据,保留数据出口;关键数据定期自己备份。
Q:秒杀超卖是前端控制还是后端控制?
A:必须以后端为准,前端按钮置灰只能防误触。后端用库存条件更新或 Redis 预扣保证不超卖,任何前端限制都可以被绕过。
Q:支付回调为什么要幂等,不做会怎样?
A:支付平台可能重复推送回调,不幂等会导致重复扣库存、重复发货、重复发券。回调先判断订单是否已处理,已处理直接返回成功。
Q:小程序、H5、PC 是分别开发吗?
A:前端展示层可分别开发或用跨端框架统一,但后端、数据库必须是一套,保证订单和库存多端一致。是否三端合一取决于方案和版本。
Q:自研电商系统大概要多少开发量?
A:商品、订单、库存、支付、营销、会员、后台管理加起来是一个中大型项目,需要前后端多人协作数月,且后续要持续维护。对中小商家通常不划算。
Q:选型时技术上最该问平台什么?
A:问清数据能否导出、支付费率如何、多端策略(三端合一还是选一)、秒杀等并发能力由谁保障、有无开放接口或二次开发能力、安全备份和运维响应机制。