电商架构:高并发、秒杀、订单与支付
电商架构:高并发、秒杀、订单与支付
电商系统架构概览
电商系统是典型的高并发、高可用场景。核心模块包括商品、购物车、订单、支付、库存、营销等。系统需要支撑大促期间的流量峰值,同时保证数据一致性。
电商系统分层架构:
用户层: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;
}
}