cqrs
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseCQRS — Quick Reference
CQRS — 快速参考
CQRS (Command Query Responsibility Segregation) sépare les opérations d'écriture et de lecture dans des modèles distincts. N'est pas par défaut — c'est une optimisation à activer quand le coût de la complexité est justifié.
CQRS(命令查询职责分离,Command Query Responsibility Segregation)将写入和读取操作分离到不同的模型中。并非默认架构——只有当复杂度带来的收益大于成本时,才应启用这种优化。
Quand utiliser
适用场景
| Pertinent | Pas pertinent |
|---|---|
| Domaine métier complexe avec règles d'invariants riches | CRUD simple, domaine pauvre |
| Ratio lectures/écritures > 10× | Petits projets, équipe junior |
| Audit / compliance (Event Sourcing naturel) | Cohérence immédiate requise |
| Read models hétérogènes (mobile vs analytics vs back-office) | Modèle de données stable et unique |
| Scale différencié reads vs writes (replicas, cache, search) | Charge faible, monolithe modeste |
Règle d'or : commencer par une architecture classique. Migrer vers CQRS lorsqu'au moins 2 des cas pertinents sont présents simultanément.
| 适用场景 | 不适用场景 |
|---|---|
| 具有丰富不变量规则的复杂业务领域 | 简单CRUD、业务逻辑薄弱的领域 |
| 读/写比例 > 10× | 小型项目、初级团队 |
| 审计/合规需求(天然适配Event Sourcing) | 要求强一致性的场景 |
| 异构读取模型(移动端 vs 分析端 vs 后台管理) | 稳定且单一的数据模型 |
| 读写需差异化扩展(副本、缓存、搜索) | 低负载、小型单体应用 |
黄金法则: 先从经典架构开始。当至少2个适用场景同时存在时,再迁移到CQRS。
Architecture en 30 secondes
30秒了解架构
[ User ]
↓
[ Command ]──────────▶ [ Write Model (Domain) ]
↓ persist + emit
[ Event(s) ]
↓
[ Query ] ◀───── [ Read Model (denormalised) ] ◀── projections- Command side : modèle normalisé, focus invariants métier. Écrit, ne lit que ce qui est nécessaire à la validation.
- Query side : modèle dénormalisé, focus performance lecture. N'a pas de logique métier.
- Projections : transforment les events en read models. Eventually consistent.
[ User ]
↓
[ Command ]──────────▶ [ Write Model (Domain) ]
↓ persist + emit
[ Event(s) ]
↓
[ Query ] ◀───── [ Read Model (denormalised) ] ◀── projections- 命令端(Command side):规范化模型,聚焦业务不变量。仅执行写入操作,仅读取验证所需的数据。
- 查询端(Query side):非规范化模型,聚焦读取性能。不包含业务逻辑。
- 投影(Projections):将事件转换为读取模型。最终一致性(Eventually consistent)。
Trade-off central
核心权衡
| Bénéfice | Coût |
|---|---|
| Scale indépendant lecture / écriture | Eventual consistency (≈ 50-500 ms latency typique) |
| Read models taillés pour chaque besoin | Plus de code à maintenir (2 modèles) |
| Event Sourcing devient facile à brancher | Debugging plus complexe (event flow) |
| Audit trail naturel | Migration tardive très coûteuse |
| 收益 | 成本 |
|---|---|
| 读写可独立扩展 | 最终一致性(典型延迟≈50-500毫秒) |
| 可为每种需求定制读取模型 | 需要维护更多代码(两个模型) |
| 轻松集成Event Sourcing | 调试更复杂(需追踪事件流) |
| 天然具备审计追踪能力 | 后期迁移成本极高 |
Patterns associés (souvent ensemble)
相关模式(常结合使用)
- Event Sourcing : stocker la séquence d'events comme source de vérité, le write model est reconstruit en replay.
- Saga / Process Manager : orchestrer des transactions distribuées via events.
- Outbox Pattern : garantir l'atomicité publication event + write DB.
- Materialized Views : projections persistées en table dédiée pour query speed.
- 事件溯源(Event Sourcing):将事件序列作为事实来源存储,通过重放事件重建写入模型。
- Saga/流程管理器(Process Manager):通过事件协调分布式事务。
- Outbox模式:确保事件发布与数据库写入的原子性。
- 物化视图(Materialized Views):将投影持久化到专用表中以提升查询速度。
Anti-patterns critiques
关键反模式
- ❌ CQRS sans cas d'usage clair → over-engineering, double charge cognitive.
- ❌ Read model qui exécute des règles métier → bug d'invariants à chaque projection.
- ❌ Projections synchrones → on perd le bénéfice scalability.
- ❌ Event Sourcing sans snapshots → replay de millions d'events au boot.
- ❌ Command qui retourne data complète → c'est une Query déguisée.
- ❌ 无明确适用场景的CQRS → 过度设计,增加认知负担。
- ❌ 读取模型执行业务规则 → 每次投影都会出现不变量错误。
- ❌ 同步投影 → 失去可扩展性优势。
- ❌ 无快照的Event Sourcing → 启动时需重放数百万事件。
- ❌ 返回完整数据的命令 → 这是伪装成命令的查询。
Pour aller plus loin
延伸阅读
Implémentations Symfony / Laravel / .NET, Event Sourcing (Prooph, EventStoreDB), saga patterns, outbox, exemples concrets, migration progressive d'un CRUD vers CQRS, checklists par phase : voir.@.claude/skills/cqrs/REFERENCE.md
Symfony/Laravel/.NET实现方案、Event Sourcing(Prooph、EventStoreDB)、Saga模式、Outbox模式、具体示例、从CRUD逐步迁移到CQRS的方法、各阶段检查清单:详见。@.claude/skills/cqrs/REFERENCE.md