LOADING

加载过慢请开启缓存 浏览器默认开启

FalshSale

2025/5/3 项目

FlashSale 秒杀系统

项目地址https://github.com/xkiven/FalshSale

简介

本秒杀系统是一个高效、稳定的系统,旨在解决高并发场景下的秒杀问题,确保用户能够公平、流畅地参与秒杀活动。系统采用了多种技术手段,如缓存、消息队列等,来应对高并发流量,避免系统崩溃和数据不一致的问题。

高并发问题及解决方法

限流问题

问题描述

在秒杀活动开始时,大量用户会同时发起请求,可能会导致服务器瞬间压力过大,甚至崩溃。

解决方法

  • IP 限流:通过 middleware/ip_ratelimit.go 中的 IpRateLimit 中间件,对每个 IP 地址的请求进行限流,每秒最多允许 1 个请求。如果某个 IP 的请求超过限制,会返回 429 Too Many Requests 错误信息。
  • 漏桶限流:通过 middleware/realize.go 中的 GatewayMiddleware 中间件,使用漏桶算法进行限流。如果请求超过桶的容量,会返回自定义的 429 错误信息。

库存超卖问题

问题描述

在高并发场景下,多个用户可能同时抢购同一件商品,导致库存数据不一致,出现超卖的情况。

解决方法

使用 Redis 原子操作,在 FlashSale/dao/redis/redis_client.go 中,使用 CheckAndDeductStock 函数通过 Redis 的原子操作 DECR 来扣减库存。如果扣减后库存小于 0,则说明商品已售罄,将库存加回去。

数据库压力问题

问题描述

大量的订单请求会对数据库造成巨大的压力,可能导致数据库性能下降甚至崩溃。

解决方法

使用 Kafka 消息队列进行异步处理,在 FlashSale/logic/order_logic.go 中,当用户成功抢购商品后,将订单信息发送到 Kafka 消息队列中,然后从消息队列中消费消息并将订单信息写入数据库。这样可以将数据库的写入操作异步化,减轻数据库的压力。

服务熔断和降级问题

问题描述

在高并发场景下,某个服务可能会因为过载而出现故障,导致整个系统的性能下降。

解决方法

使用 afex/hystrix-go 库实现熔断降级机制,在 FlashSale/rpc/order/main.go 中,配置了 create_order 命令的熔断参数,当请求超时、并发请求数超过限制或错误率达到阈值时,会触发熔断,执行降级逻辑。在 FlashSale/logic/order_logic.go 中,使用 hystrix.Do 函数包裹订单创建逻辑,当出现错误时,执行降级逻辑,返回系统繁忙的提示信息。

并发处理问题

问题描述

在高并发场景下,需要高效地处理多个订单请求,以提高系统的吞吐量。

解决方法

在 FlashSale/logic/order_logic.go 中,使用 goroutinechannel 实现并发处理多个订单请求。通过启动多个工作协程,将订单任务分发到任务通道中,每个工作协程从任务通道中获取任务并处理,最后将处理结果发送到结果通道中。