# seckill **Repository Path**: light_shadow/seckill ## Basic Information - **Project Name**: seckill - **Description**: No description available - **Primary Language**: Unknown - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-04-30 - **Last Updated**: 2022-05-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 一 程序运行方法 ## 1 使用了zookeeper作为服务注册和发现,需要在本地启动一个zookeeper, mysql, redis, rocketmq order库的用户订单表 ```sql CREATE TABLE `user_order` ( `id` bigint(20) NOT NULL COMMENT '订单id', `user_id` bigint(20) NOT NULL COMMENT '用户id', `product_id` bigint(20) NOT NULL COMMENT '商品id', `deleted` int(255) NOT NULL DEFAULT '0' COMMENT '逻辑删除字段', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` stock库的库存表 ```sql CREATE TABLE `product` ( `id` bigint(20) NOT NULL COMMENT '商品id', `product_name` varchar(255) NOT NULL COMMENT '商品名称', `stock` int(255) NOT NULL COMMENT '库存', `deleted` int(255) NOT NULL DEFAULT '0' COMMENT '逻辑删除字段', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ``` ## 2 分别运行secondkill application, order-service application, stock-service application: ## 3 接口访问 ```json 请求url: localhost:8002/seckill/kill header: Content-Type:application/json requestbody: { "userId": 1, "productId":1 } ``` ## 4 或者启动jmeter,运行 jmeter文件夹下的秒杀.jmx 就能看到效果 ![resutl1](pic/result1.png) ![resutl1](pic/result2.png) 我们发现打印的日志,只有10个人秒杀成功,因为我们的库存只有10个,如下图 ![stock](pic/stock.png) # 二 实现说明 ## 整体架构设计 ![jiagou](pic/jiagou.png) ## 整体时序 ![shixu](pic/shixu.png) ## 实现思路 在秒杀的请求到来的时候,通过rocketmq异步、削峰、填谷,将秒杀消息发送至库存服务,库存服务通过查询库存, 将库存缓存在redis,通过lua脚本进行扣减库存,库存扣减成功之后,调用订单服务生成订单。
TODO: 应该将redis的库存数据,定时更新到数据库的,这一步因为时间原因,暂时没有做。 ## 注意点 在本地的测试中,redis和rocketmq都是用的是单机模式,如果是正式使用的话必须使用集群方式, 做到高可用 # 三 感受及问题 ## 1本来打算使用spring cloud gateway来进行请求的,但是本地环境配置有问题,一直没做好 ## 2 折腾环境还是挺费时间的,差不多搞了快整整一天了