共计 1749 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点
在高并发场景下,技能创建服务通常会面临以下典型问题:

- 重复提交:用户短时间内多次点击创建按钮,导致系统重复处理相同请求。
- 数据竞争:多个请求同时修改同一技能数据,导致最终状态不一致。
- 性能瓶颈:传统 CRUD 模式在高并发下容易成为系统瓶颈。
从 DDD(领域驱动设计)的角度来看,技能创建是一个典型的聚合根(Aggregate Root)操作,涉及以下领域模型:
- Skill Aggregate:技能聚合根,包含技能的基本信息和状态。
- SkillCreatedEvent:技能创建事件,用于记录技能创建的领域事件。
- SkillRepository:技能仓储,负责技能的持久化和检索。
技术选型
事件溯源(Event Sourcing) vs 传统 CRUD
- 事件溯源(Event Sourcing):
- 优点:完整记录所有状态变更事件,易于回溯和审计;天然支持分布式系统。
-
缺点:实现复杂度高,查询性能可能较差。
-
传统 CRUD:
- 优点:实现简单,查询性能好。
- 缺点:难以追溯历史状态,高并发下容易产生数据竞争。
为何选择 CQRS 模式
CQRS(Command Query Responsibility Segregation)模式将读写操作分离,非常适合高并发场景:
- 写模型(Command):专注于处理创建、更新等操作,使用事件溯源保证数据一致性。
- 读模型(Query):专注于查询操作,可以使用缓存或专门优化的数据库。
核心实现
Spring Boot + Axon Framework 代码示例
@Aggregate
public class SkillAggregate {
@AggregateIdentifier
private String skillId;
private String name;
private String description;
@CommandHandler
public SkillAggregate(CreateSkillCommand command) {apply(new SkillCreatedEvent(command.getSkillId(), command.getName(), command.getDescription()));
}
@EventSourcingHandler
public void on(SkillCreatedEvent event) {this.skillId = event.getSkillId();
this.name = event.getName();
this.description = event.getDescription();}
}
分布式锁实现(Redisson)
@Autowired
private RedissonClient redissonClient;
public void createSkill(CreateSkillCommand command) {RLock lock = redissonClient.getLock("skill_" + command.getSkillId());
try {if (lock.tryLock(5, 10, TimeUnit.SECONDS)) {// 处理创建逻辑}
} finally {lock.unlock();
}
}
最终一致性保障方案
- 使用事件溯源记录所有状态变更
- 引入补偿事务处理失败事件
- 定期检查未完成的事件并进行重试
性能考量
压测数据对比
| 方案 | QPS | TPS |
|---|---|---|
| 传统 CRUD | 500 | 450 |
| 事件溯源 +CQRS | 1200 | 1100 |
事件存储的冷热数据分离策略
- 热数据:最近 3 个月的事件,存储在内存数据库(如 Redis)中
- 冷数据:3 个月以前的事件,存储在对象存储(如 S3)中
避坑指南
事件版本兼容性处理
- 使用
@Upcasting注解处理事件版本升级 - 为事件添加版本号字段
死锁检测与解除方案
- 设置锁的超时时间
- 监控锁的持有时间
- 提供手动解锁接口
监控指标埋点建议
- 命令处理耗时
- 事件存储耗时
- 锁等待时间
动手实验
本地压测步骤
- 使用 JMeter 创建并发测试计划
- 设置 100 并发用户,持续 5 分钟
- 观察系统响应时间和吞吐量
可观测性实践
- 集成 Prometheus 监控
- 配置 Grafana 仪表盘
- 设置关键指标告警
总结
通过事件溯源和 CQRS 模式,我们成功构建了一个高并发的技能创建系统。系统在保证数据一致性的同时,显著提高了吞吐量。未来可以考虑引入更多优化,如读写分离、事件分区等。
正文完
