秒杀场景的挑战
秒杀是电商中常见的抢购商品场景,其技术特点是瞬间请求量巨大,对服务的性能和一致性要求极高。即使服务出现崩溃,也必须确保库存扣减和订单生成保持一致,避免出现超卖或超买的现象。通过使用 dtm(分布式事务管理器),可以轻松解决库存与订单数据不一致的问题。
构建秒杀服务
秒杀服务(http)代码由 sponge 自动生成(选择 ⓷基于 protobuf 创建 web 服务
),开发者只需在生成的模板代码文件 (例如 internal/handler/flashSale.go) 中填写秒杀相关的业务逻辑。
下图是生成代码的界面:
解压代码,切换到项目目录(如 flashSale 目录),执行以下命令:
# 生成代码
make proto
# 打开 internal/handler/flashSale.go 文件,按照生成的示例代码添加业务逻辑代码。
# 编译并启动服务
make run
更详细的 sponge 创建 web 服务的开发文档请参考:sponge Web 开发文档。
这是添加业务逻辑后的flashSale服务代码。
快速开始
-
启动 Redis 服务
-
启动 dtm 服务
- 下载 dtm 可执行文件,修改 dtm 默认配置以使用 Redis 作为存储,并启动 dtm 服务:
dtm -c conf.yml
- 下载 dtm 可执行文件,修改 dtm 默认配置以使用 Redis 作为存储,并启动 dtm 服务:
-
配置项目
- 克隆项目代码flashSale到本地,打开配置文件
configs/flashSale.yml
,修改 Redis 和 dtm 的配置项,将默认的 IP 地址(如 192.168.3.37 和 192.168.3.90)替换为实际环境中的 IP 地址(如果所有服务在本地运行,填写127.0.0.1即可)。
- 克隆项目代码flashSale到本地,打开配置文件
-
编译并启动服务
- 可以直接使用以下命令编译并运行服务:
cd cmd/flashSale go run main.go
- 或者,如果已安装 sponge,直接运行以下命令启动服务:
make run
- 可以直接使用以下命令编译并运行服务:
-
测试秒杀 API
- 在浏览器中访问 http://localhost:8080/apis/swagger/index.html,通过 Swagger UI 测试秒杀抢购 API。
API 测试示例:
-
设置库存 API
- 请求示例参数:
{ "productID": 1, "stock": 3 }
- 请求示例参数:
-
秒杀请求 API
- 请求示例参数:
{ "productID": 1, "amount": 100, "userID": 1 }
- 如果库存不足,则返回 409 状态码,表示秒杀失败。
- 请求示例参数:
-
性能压测api
在进行性能压测时,为避免终端日志输出影响服务性能,建议将服务以后台模式运行。已安装 sponge 的情况下,可使用以下命令在后台启动服务:
make run-nohup
使用ab、wrk等压测工具进行压测api。
总结
通过结合 sponge 和 dtm,可以快速搭建一个高性能、高可靠的秒杀服务,彻底解决库存与订单数据不一致的问题。该方案不仅简化了开发流程,还能显著提升服务的并发处理能力和稳定性,是构建电商秒杀系统的理想选择。