转载 | 事件驱动系统中的声明检查模式是什么?
Apr 23, 2025
在分布式系统中,服务之间的通信通常依赖于消息传递。消息在各组件之间发送,以触发操作、共享数据或同步状态。然而,随着系统复杂度的增加,这些消息的大小可能成为一个重大挑战。直接传输包含大量负载的消息可能会使消息代理不堪重负,消耗过多带宽,并减慢处理速度。此外,一些消息代理对消息大小有限制,使得不可能直接发送大负载的消息。
What is the Claim-Check Pattern?
声明检查模式是一种消息设计模式,它将大数据负载的传输与实际消息分离开来。该模式不是将整个负载包含在消息中发送,而是将负载存储在外部存储系统中(例如,数据库、对象存储或文件系统),并只在消息中发送对存储数据的引用。这个引用通常被称为“声明检查”,类似于你在寄存衣物时收到的票据。该过程通过多步骤实现:
- 存储负载:当服务需要发送大消息时,首先将负载上传到外部存储系统。这可以是像Amazon S3、Azure Blob存储这样的云存储服务,或者分布式文件系统。
- 生成引用:一旦负载被存储,服务或数据库会生成一个唯一的引用(例如 URL、文件路径或数据库键),指向存储的数据。
- 发送声明检查:发送方服务不会发送整个负载,而是发送一个轻量级消息,消息中只包含引用(声明检查)及任何必要的元数据。
- 获取负载:接收服务使用声明检查从外部存储系统获取负载,当需要时进行取回。
Claim-Check with Event Sourcing for Privacy
事件溯源(Event Sourcing)是一种模式,其中应用程序的状态由一系列事件决定。然而,直接在事件中存储所有信息可能在处理敏感数据时引发隐私问题。声明检查(Claim-Check)通过确保敏感数据不直接存储在事件流中,从而在事件溯源中提升了隐私保护。
- 分开存储敏感数据:不要将敏感数据(例如个人身份信息或 PII)直接嵌入事件中,而是存储在安全的外部存储系统中。
- 为敏感数据生成声明检查:在事件日志中仅包含声明检查(引用)。这确保敏感数据不会暴露在事件流中。
- 负载检索的访问控制:对外部存储系统实施严格访问控制,确保只有授权的服务或用户可以检索敏感数据。
- 审计追踪:事件溯源天然提供事件的审计追踪。结合存储位置的访问日志,可以维护完整的数据访问审计记录。
- 数据保留策略:对外部存储系统应用数据保留策略,在指定期限后自动删除或匿名化敏感数据,确保符合 GDPR 等隐私法规。
- 数据加密:敏感数据在存储前可以加密,提供额外的安全层。
Pros and Cons
优点:
- 减少消息大小:通过将大负载存储在外部,消息变得轻量,提升性能并减少带宽使用。
- 增强安全性:敏感数据可以单独存储,并通过受控授权访问。数据和元数据可以应用不同的保留策略。
- 提高可扩展性:较小的消息减少了消息代理的负载,使系统能够处理更高的消息量。
- 成本效益:将大负载存储在成本效益高的存储系统(例如对象存储)中,通常比通过消息代理传输更便宜。
缺点:
- 复杂性增加:该模式引入了额外的组件(例如外部存储)和步骤(例如上传和检索负载),这可能使系统变得复杂。
- 延迟开销:从外部存储获取负载会增加延迟,这在低延迟系统中可能无法接受。
- 依赖外部存储:系统依赖于外部存储系统的可用性和性能。如果存储系统不可用,消息将无法被完全处理。
- 孤立数据的风险:如果声明检查丢失或未被处理,存储的数据可能变成孤立数据,占用存储空间但无实际用途。