技能 projection-patterns
📦

projection-patterns

安全

构建 CQRS 投影和读模型

也可从以下获取: wshobson

在事件溯源系统中为查询性能而苦恼?此技能提供了从事件流构建高效读模型和投影的经过验证的模式。

支持: Claude Codex Code(CC)
🥉 75 青铜
1

下载技能 ZIP

2

在 Claude 中上传

前往 设置 → 功能 → 技能 → 上传技能

3

开启并开始使用

测试它

正在使用“projection-patterns”。 用户要求基础投影器模板

预期结果:

提供 Python Projection 基类,包含 name、handles() 和 apply() 的抽象方法。包含具有检查点管理和批处理的 Projector 运行器。展示数据库操作的 async/await 模式。

正在使用“projection-patterns”。 用户需要订单摘要投影

预期结果:

提供 OrderSummaryProjection 类,处理 OrderCreated、OrderItemAdded、OrderShipped 事件。每个处理程序更新特定列。演示参数化 SQL 查询和连接池。

正在使用“projection-patterns”。 用户想要重建损坏的投影

预期结果:

解释重建过程:删除检查点,可选择清除读模型表,从位置 0 重新运行投影。强调幂等性要求以安全重播。

安全审计

安全
v1 • 2/24/2026

This skill contains documentation and Python code examples for CQRS projection patterns. Static analyzer flagged markdown code blocks as shell commands (false positive). URLs are documentation references, not network calls. No executable code, cryptographic operations, or system access detected. Safe for publication.

2
已扫描文件
538
分析行数
0
发现项
1
审计总数
未发现安全问题
审计者: claude

质量评分

38
架构
100
可维护性
87
内容
50
社区
100
安全
100
规范符合性

你能构建什么

电商订单投影

构建读模型,将订单事件聚合为客户可见的摘要,并提供实时状态更新。

从事件构建搜索索引

创建 Elasticsearch 投影,使产品目录与领域事件保持同步以实现全文搜索。

分析仪表板数据

实现聚合投影,计算每日指标,如销售总额和用户活动。

试试这些提示

基础投影设置
I need to build a read model for order events. Show me how to create a basic projector that handles OrderCreated and OrderUpdated events, stores checkpoints, and updates a SQL table.
Elasticsearch 集成
Create a projection that syncs product domain events to Elasticsearch. Include handling for ProductCreated, ProductUpdated, and ProductDeleted events with proper error handling.
聚合模式
Show me how to build an aggregating projection that computes daily sales metrics from OrderCompleted events. Include UPSERT logic for efficient updates.
多表事务投影
I need a projection that updates multiple tables atomically when processing CustomerOrderPlaced events. Show transaction handling and rollback patterns.

最佳实践

  • 使投影具有幂等性 - 可以安全地多次重播事件而不会产生副作用
  • 在每个事件后存储检查点以在失败后启用恢复
  • 对多表更新使用数据库事务以保持一致性

避免

  • 耦合投影 - 每个投影应该是独立和可隔离的
  • 跳过错误处理 - 未处理的异常会停止投影并导致数据延迟
  • 乱序处理事件 - 始终遵循 global_position 排序

常见问题

投影和读模型有什么区别?
投影是将事件转换为读模型的过程。读模型是针对查询优化的结果数据结构(数据库表、缓存、搜索索引)。
如何处理乱序到达的事件?
使用事件存储中的 global_position 确保严格排序。拒绝或缓冲在其前驱事件之前到达的事件。事件存储保证顺序,而不是消息总线。
如果读模型损坏,我可以重建投影吗?
可以。删除投影检查点并清除读模型表,然后从位置 0 重新运行。这要求投影具有幂等性。
投影应该是同步还是异步?
使用异步处理以实现可扩展性。投影通常作为从事件流消费的后台工作程序运行,而不是在写事务中运行。
如何处理投影失败?
记录完整事件上下文的错误,对重复失败发出警报,并实现具有指数退避的重试逻辑。考虑为有毒事件使用死信队列。
读模型应该使用什么数据库?
根据查询模式选择:PostgreSQL 用于关系查询,Elasticsearch 用于全文搜索,Redis 用于缓存,或列存储用于分析。多个投影可以使用不同的数据库。