每天一道面试题:如何设计一个高并发红包系统架构?

120 阅读4分钟

面试官:"抢红包业务场景很常见,如果让你设计一个支持春晚级别并发的红包系统,你会怎么考虑?"

红包系统是金融级高并发系统的典型代表,与秒杀系统既有相似之处又有本质区别。今天我们就来深入解析红包系统的架构设计,让你在面试中能够从容应对这类高阶问题。

一、核心难点:为什么红包系统比秒杀更复杂?

1. 极致的并发压力

  • 春晚级别场景:瞬时千万级并发请求同时涌入
  • 单热点扩散:一个红包可能被数万人同时抢夺,形成"热点中的热点"
  • 全局压力分布:无数个红包同时被抢,全局并发量呈指数级增长

2. 严格的资金安全要求

  • 零超卖容忍:资金相关业务绝对不能出现超发现象
  • 强一致性要求:账户余额变动必须保证绝对准确
  • 事务完整性:从抢红包到资金入账必须保证事务完整

3. 实时性约束

  • 同步业务模式:用户需要实时知道抢红包结果,不能采用异步方案
  • 延迟敏感性:处理延迟直接影响用户体验
  • 性能稳定性:高峰期必须保持稳定的响应时间

二、架构设计方案:分层防护与数据分治

2.1 接入层:垂直切分与智能路由

理论要点:

  • 基于红包ID的垂直切分:每个红包的所有操作(发、抢、拆、查)路由到同一台机器处理
  • 一致性哈希路由:保证相同红包ID的请求总是落到同一服务实例
  • 本地化处理:减少跨节点调用,提升处理效率
// 基于红包ID的路由决策器
@Component
public class RedPacketRouter {
    
    private List<String> serverNodes = Arrays.asList(
        "node1:8080""node2:8080""node3:8080""node4:8080"
    );
    
    public String routeServer(String redPacketId) {
        // 使用一致性哈希算法选择节点
        int hash = Math.abs(redPacketId.hashCode());
        int index = hash % serverNodes.size();
        return serverNodes.get(index);
    }
}
2.2 请求处理层:队列化与流量控制

理论要点:

  • 请求排队:将并发请求转为串行处理,避免数据库锁竞争
  • 多层防护:在数据库前设置缓存层进行CAS控制
  • 过载保护:高并发时直接快速失败,保护系统稳定性
// 红包核心服务 - CAS控制与队列处理
@Service
public class RedPacketService {
    
    @Autowired
    private RedisTemplate<StringInteger> redisTemplate;
    
    public boolean grabRedPacket(String redPacketId, String userId) {
        // 1. 缓存CAS控制 - 第一层防护
        String casKey = "redpacket:cas:" + redPacketId;
        Long currentCount = redisTemplate.opsForValue().increment(casKey);
        
        if (currentCount > 1000) { // 超过阈值直接返回失败
            redisTemplate.opsForValue().decrement(casKey);
            return false;
        }
        
        // 2. 进入队列等待处理(具体队列实现略)
        return processInQueue(redPacketId, userId);
    }
}
2.3 数据层:冷热分离与分表策略

理论要点:

  • 热数据缓存:活跃红包数据放在内存中加速访问
  • 冷热分离:已结束的红包数据归档到冷存储
  • 时间分表:按创建时间进行分表,避免单表过大
// 红包数据访问层 - 分表策略
@Repository
public class RedPacketDao {
    
    // 根据时间确定表名
    private String getTableName(Date createTime) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM");
        return "red_packet_" + sdf.format(createTime);
    }
    
    public void saveRedPacket(RedPacket redPacket) {
        String tableName = getTableName(redPacket.getCreateTime());
        // 执行SQL操作
    }
}

三、架构亮点与面试加分项

1. 分层消峰设计

  • 第一层:CAS缓存控制,拦截过量请求
  • 第二层:请求队列化,变并发为串行
  • 第三层:数据库事务,保证最终一致性

2. 数据分治策略

  • 垂直分片:按红包ID路由,避免跨节点事务
  • 水平分表:按时间分表,解决数据膨胀问题
  • 冷热分离:优化存储成本与访问性能

总结回顾

红包系统架构的核心设计思想:

用户请求
➡️ 接入层: (垂直切分) | (一致性哈希路由)  
➡️ 处理层: [CAS缓存控制] → [请求队列化] → [串行处理]
➡️ 数据层: (热数据缓存) | (冷热分离) | (时间分表)
➡️ 资金层: [数据库事务] → [资金操作] → [流水记录]

本文由微信公众号"程序员小胖"整理发布,转载请注明出处。

明日面试题预告:分布式限流架构。