cqrs

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

CQRS — 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

适用场景

PertinentPas pertinent
Domaine métier complexe avec règles d'invariants richesCRUD 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éficeCoût
Scale indépendant lecture / écritureEventual consistency (≈ 50-500 ms latency typique)
Read models taillés pour chaque besoinPlus de code à maintenir (2 modèles)
Event Sourcing devient facile à brancherDebugging plus complexe (event flow)
Audit trail naturelMigration 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