← 返回首页
💼

电商架构:高并发、秒杀、订单与支付

📂 architecture ⏱ 2 min 296 words

电商架构:高并发、秒杀、订单与支付

电商系统架构概览

电商系统是典型的高并发、高可用场景。核心模块包括商品、购物车、订单、支付、库存、营销等。系统需要支撑大促期间的流量峰值,同时保证数据一致性。

电商系统分层架构:

用户层:Web、App、小程序、H5
接入层:CDN、负载均衡、WAF、限流
网关层:API网关、鉴权、限流、路由
业务层:
  - 商品服务:商品管理、类目、属性
  - 购物车服务:购物车管理、价格计算
  - 订单服务:下单、支付、履约
  - 支付服务:支付、退款、对账
  - 库存服务:库存管理、扣减、预占
  - 营销服务:优惠券、满减、秒杀
数据层:MySQL、Redis、Elasticsearch、MongoDB
基础设施:消息队列、配置中心、日志系统

高并发架构设计

电商系统需要应对大促期间的流量洪峰。核心策略包括:流量削峰、读写分离、缓存加速、异步处理。

// 流量削峰:使用消息队列缓冲订单
@Service
public class OrderService {
    @Autowired
    private RocketMQTemplate rocketMQTemplate;
    
    public Result submitOrder(OrderDTO orderDTO) {
        // 1. 参数校验
        validateOrder(orderDTO);
        
        // 2. 库存预扣(Redis)
        boolean stockDeducted = stockService.preDeduct(orderDTO);
        if (!stockDeducted) {
            return Result.fail("库存不足");
        }
        
        // 3. 发送订单消息到MQ
        rocketMQTemplate.convertAndSend("order-topic", orderDTO);
        
        // 4. 返回处理中状态
        return Result.success("订单处理中");
    }
}

秒杀系统设计

秒杀是电商最具挑战的场景,需要处理瞬间高并发,同时保证库存准确性。核心思路是层层过滤,将请求量降到数据库能承受的范围。

# 秒杀系统核心流程
class SeckillService:
    def seckill(self, user_id, item_id):
        # 第一层:本地缓存标记
        if self.is_sold_out(item_id):
            return "已售罄"
        
        # 第二层:Redis预扣库存
        success = self.redis_deduct_stock(item_id)
        if not success:
            # 标记售罄,避免后续请求
            self.mark_sold_out(item_id)
            return "已售罄"
        
        # 第三层:发送MQ异步处理订单
        self.send_seckill_order(user_id, item_id)
        return "抢购成功,订单处理中"
    
    def redis_deduct_stock(self, item_id):
        # Lua脚本保证原子性
        lua_script = """
        local stock = tonumber(redis.call('get', KEYS[1]) or 0)
        if stock > 0 then
            redis.call('decr', KEYS[1])
            return 1
        end
        return 0
        """
        return self.redis.eval(lua_script, 1, f"stock:{item_id}")

订单系统设计

订单系统是电商的核心,需要处理复杂的业务逻辑,包括订单创建、状态流转、超时取消、售后等。设计时要考虑扩展性和数据一致性。

// 订单状态机
public enum OrderStatus {
    CREATED("已创建", Arrays.asList("PAID", "CANCELLED")),
    PAID("已支付", Arrays.asList("SHIPPED", "REFUNDING")),
    SHIPPED("已发货", Arrays.asList("DELIVERED", "RETURNING")),
    DELIVERED("已签收", Arrays.asList("COMPLETED", "RETURNING")),
    COMPLETED("已完成", Collections.emptyList()),
    CANCELLED("已取消", Collections.emptyList()),
    REFUNDING("退款中", Arrays.asList("REFUNDED")),
    RETURNING("退货中", Arrays.asList("RETURNED"));
    
    private final String description;
    private final List<String> allowedTransitions;
    
    public boolean canTransitTo(OrderStatus targetStatus) {
        return allowedTransitions.contains(targetStatus.name());
    }
}

库存系统设计

库存是电商的核心资源,需要保证准确性和高性能。设计要点包括:库存预扣、库存回补、库存分层。

# 库存分层设计
class StockService:
    def __init__(self):
        self.redis_stock = RedisStock()   # Redis缓存层
        self.db_stock = DBStock()          # 数据库持久层
        self.local_stock = LocalStock()    # 本地缓存层
    
    def get_stock(self, item_id):
        # 多级缓存查询
        stock = self.local_stock.get(item_id)
        if stock is not None:
            return stock
        
        stock = self.redis_stock.get(item_id)
        if stock is not None:
            self.local_stock.set(item_id, stock, ttl=10)
            return stock
        
        stock = self.db_stock.get(item_id)
        self.redis_stock.set(item_id, stock, ttl=300)
        return stock
    
    def pre_deduct(self, item_id, quantity):
        # Redis预扣库存
        success = self.redis_stock.deduct(item_id, quantity)
        if success:
            # 异步同步到数据库
            self.sync_to_db_async(item_id, quantity)
        return success

支付系统设计

支付系统需要保证资金安全,支持多种支付方式,处理退款和对账。核心要求是幂等性和一致性。

// 支付幂等性设计
@Service
public class PaymentService {
    @Autowired
    private PaymentIdempotentService idempotentService;
    
    public PayResult pay(PayRequest request) {
        // 1. 幂等性检查
        String idempotentKey = generateIdempotentKey(request);
        if (idempotentService.isProcessed(idempotentKey)) {
            return idempotentService.getResult(idempotentKey);
        }
        
        // 2. 调用支付渠道
        PayResult result = callPaymentChannel(request);
        
        // 3. 记录结果(幂等)
        idempotentService.saveResult(idempotentKey, result);
        
        // 4. 更新订单状态
        updateOrderStatus(request.getOrderNo(), result);
        
        return result;
    }
}