1. CQRS模式的核心概念与适用场景
CQRS(Command Query Responsibility Segregation)是一种将读写操作分离的架构模式。我第一次接触这个概念是在处理一个电商促销系统时,当时每秒要处理上万次的价格查询和数百次的订单提交,传统的CRUD架构已经明显力不从心。
与传统的CRUD模式不同,CQRS将模型分为两部分:
- 命令模型(Command Model):处理创建、更新和删除操作(CUD)
- 查询模型(Query Model):专门负责数据读取(R)
这种分离带来了几个显著优势:
- 读写负载可以独立扩展,比如查询服务可以部署更多实例
- 可以针对读写分别优化数据结构,比如写用关系型数据库,读用Redis
- 避免复杂的领域模型污染查询性能
- 更容易实现事件溯源(Event Sourcing)
在PHP生态中,CQRS特别适合以下场景:
- 高并发读取的应用(如新闻门户、商品详情页)
- 需要复杂业务逻辑的写操作(如订单系统)
- 读写比例严重失衡的系统(典型如10:1的读多写少场景)
注意:CQRS不是银弹,它会增加系统复杂度。对于简单的CRUD应用,传统模式可能更合适。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. PHP实现CQRS的基础架构设计
2.1 典型组件划分
一个完整的PHP CQRS实现通常包含这些核心组件:
-
命令总线(Command Bus)
- 负责接收和分发命令
- 常用实现:Tactician、SimpleBus
-
事件总线(Event Bus)
- 处理领域事件
- 常用工具:Symfony Messenger
-
读写存储分离
- 写库:MySQL/PostgreSQL
- 读库:Elasticsearch/Redis
-
投影服务(Projection)
- 将写模型变更同步到读模型
2.2 基础代码结构示例
code复制src/
├── Application/
│ ├── Command/ # 命令定义
│ ├── Query/ # 查询定义
│ └── Handler/ # 命令/查询处理器
├── Domain/
│ ├── Model/ # 领域模型
│ └── Event/ # 领域事件
├── Infrastructure/
│ ├── Persistence/ # 持久化实现
│ └── Projection/ # 投影服务
└── Presentation/
├── Controller/ # 控制器
└── View/ # 视图模型
2.3 命令处理流程示例
php复制// 定义命令
class CreateProductCommand {
public function __construct(
public readonly string $id,
public readonly string $name,
public readonly float $price
) {}
}
// 命令处理器
class CreateProductHandler {
public function __construct(
private ProductRepository $repository
) {}
public function __invoke(CreateProductCommand $command): void
{
$product = new Product(
$command->id,
$command->name,
$command->price
);
$this-
