使用 sponge + dtm 轻松实现高性能秒杀抢购服务,解决了库存与订单数据不一致的难题

371 阅读3分钟

秒杀场景的挑战

秒杀是电商中常见的抢购商品场景,其技术特点是瞬间请求量巨大,对服务的性能和一致性要求极高。即使服务出现崩溃,也必须确保库存扣减和订单生成保持一致,避免出现超卖或超买的现象。通过使用 dtm(分布式事务管理器),可以轻松解决库存与订单数据不一致的问题。


构建秒杀服务

秒杀服务(grpc+http)的代码由 sponge 自动生成(选择 ⓺基于protobuf创建grpc+http服务),开发者只需在生成的模板代码文件 (例如 internal/service/flashSale.go) 中填写秒杀相关的业务逻辑。秒杀服务(grpc+http)是grpc服务,服务内置了http请求转发功能,因此服务提供了http和grpc两种协议。

下图生成秒杀代码的界面:

flash-sale-grpc-http-pb.png

解压代码,切换到项目目录(如 flashSale 目录),执行以下命令:

# 生成代码
make proto

# 打开 internal/service/flashSale.go 文件,按照生成的示例代码添加业务逻辑代码。

# 编译并启动服务
make run

更详细的 sponge 创建 gtpc+http 混合架构服务的开发文档请参考:sponge gRPC+HTTP 开发文档

这是添加业务逻辑后的flashSale服务代码


快速开始

  1. 启动 Redis 服务

  2. 启动 dtm 服务

    • 下载 dtm 可执行文件,修改 dtm 默认配置以使用 Redis 作为存储,并启动 dtm 服务:
      dtm -c conf.yml
      
  3. 配置项目

    • 克隆项目代码flashSale到本地,打开配置文件 configs/flashSale.yml,修改 Redis 和 dtmservice 的配置项,将默认的 IP 地址(如 192.168.3.37 和 192.168.3.90)替换为实际环境中的 IP 地址(如果所有服务在本地运行,填写127.0.0.1即可)。
  4. 编译并启动服务

    • 可以直接使用以下命令编译并运行服务:
      cd cmd/flashSale
      go run main.go
      
    • 或者,如果已安装 sponge,直接运行以下命令启动服务:
      make run
      

测试秒杀 API

服务支持http和grpc两种协议,因此既可以在swagger页面上测试秒杀抢购api,也可以使用内置的grpc客户端测试秒杀抢购api。

(1) 测试gRPC api示例:

打开代码文件 internal/service/flashSale_client_test.go,填写参数后,开始测试。

可以使用 Goland IDE 测试:

flash-sale-grpc-client-test.png

也可以使用go test命令测试:

	# 执行命令前先填写参数

	# 设置库存数量
	go test -run Test_service_flashSale_methods/SetProductStock
	
	# 秒杀抢购
	go test -run Test_service_flashSale_methods/FlashSale

(2) 测试HTTP api 示例:

flash-sale-swagger.png

  1. 设置库存 API

    • 请求示例参数:
      {
        "productID": 1,
        "stock": 3
      }
      
  2. 秒杀请求 API

    • 请求示例参数:

      {
        "productID": 1,
        "amount": 100,
        "userID": 1
      }
      
    • 如果库存不足,则返回 409 状态码,表示秒杀失败。


性能压测

在进行性能压测时,为避免终端日志输出影响服务性能,建议将服务以后台模式运行。已安装 sponge 的情况下,可使用以下命令在后台启动服务:

make run-nohup

gRPC api性能压测

打开文件internal/service/flashSale_client_test.go,可以使用Goland IDE测试,也可以使用命令行测试。

# 压测前请填写参数
go test -run Test_service_flashSale_benchmark/FlashSale

HTTP api性能压测

使用ab、wrk等压测工具进行压测api。


总结

通过结合 sponge 和 dtm,可以快速搭建一个高性能、高可靠的秒杀服务,彻底解决库存与订单数据不一致的问题。该方案不仅简化了开发流程,还能显著提升服务的并发处理能力和稳定性,是构建电商秒杀系统的理想选择。