原文链接: Event Sourcing Pattern - GeeksforGeeks
有些词翻的不对,请在评论里指正👍。
目录
什么是事件源(What is Event Sourcing?)
捕捉事件而非状态 (Capture Events Instead of State)
顺序存储事件(Store Events in Sequence)
回放事件以重建状态(Reconstruct State by Replaying Events)
回放事件来调试 (Replay Events for Debugging)
供应链管理(Supply Chain Management)
游戏和虚拟环境(Gaming and Virtual Environments)
Event Sourcing Pattern 现实例子之银行账户管理系统
什么是事件源(What is Event Sourcing?)
Event Sourcing Pattern 就像为你的软件写一本详细的日记。而不是只保留目前的数据状态,对每一次的变动(change)都记录成一次事件(event)。
随着时间的推移,这些事件(events)展示了数据的完整历史。通过回放这些事件来重建数据,来理解它发展历程。
1,事件按顺序存放,形成一个日志或所发生的操作的日记。
2,任何时间点都可以通过回放这些事件,来重置程序的状态。
3,频繁用于历史数据至关重要的 金融行业 和 电商行业等。
Event Sourcing 的关键组件和概念
1,事件(Events)
这些是系统状态更改的永久记录(permanent records)。除了表示特定的动作或事件外,每个事件还包括重建事件发生时系统状态所需的所有相关信息。
2,事件存储(Event Store)
系统产生的事件流由事件存储(一个健壮的数据存储)维持(sustained)。它通过按接收顺序存储事件来保证事件的顺序得到维护。
3,聚合体(Aggregate)
为了处理命令和生成事件,聚合体是作为单个单元处理的链接域对象的逻辑集合。系统的状态更改和业务逻辑包含在聚合中。在事件存储中,每个聚合体都链接到不同的事件流。(For the purposes of processing commands and producing events, an aggregate is a logical collection of linked domain objects that are handled as a single unit. The system's state changes and business logic are contained in aggregates. In the event store, each aggregate is linked to a distinct stream of events.)
4,命令 (Command)
客户端或其他系统组件可以发出命令,这些命令是执行特定任务的请求或指令(instructions)。聚合(Aggregates)通过验证命令、应用业务逻辑以及(如果命令得到批准)生成适当的事件 的方式处理命令(commands)。(Clients or other system components can issue commands, which are requests or instructions to carry out particular tasks. Aggregates process commands by validating them, applying business logic, and, if the command is approved, generating the appropriate events.)
5,放映(Projection)
放映是从事件存储中保存的事件流中创建的读取模型,事件存储显示了系统的当前状态。放映用于提供有效的数据访问,以便进行报告和查询。(Projections are read models created from the stream of events kept in the event store that shows the system's current state. Projections are used to give effective access to data for reporting and querying.)
6,事件总线(Event Bus)
事件总线是一种消息传递基础架构,它使各种系统组件更容易就事件进行通信。它使组件能够异步响应特定的事件类型并订阅它们。
Event Sourcing Pattern怎么工作的?
捕捉事件而非状态 (Capture Events Instead of State)
每一个系统修改都被记录为一个事件(例如,“order created”、“item added”、“order completed”),而不是仅仅保留最终状态(例如,“order is completed”)。每个事件表示一个不同的动作或修改。
顺序存储事件(Store Events in Sequence)
所有事件都按照它们发生的确切顺序存储在一个序列中(通常在数据库或事件存储中)。这一系列事件充当了系统的“真理之源(source of truth)”。
回放事件以重建状态(Reconstruct State by Replaying Events)
当你需要知道当前状态时,系统会“重放”或处理所有过去的事件,从头开始建立状态。
处理新事件(Handle New Events)
当新的更改发生时,会创建新的事件并将其添加到序列中。例如,如果订单被更新,则会在序列中添加一个新事件(例如“order updated”),而不会更改或删除过去的事件。
回放事件来调试 (Replay Events for Debugging)
如果您需要查看历史记录或调查问题,可以回放事件以查看状态随时间的变化。这种回放功能使人们很容易理解所采取的操作顺序,并跟踪任何错误或问题。
Event Sourcing Pattern 的优点
1,记录了系统所有的变动,实现了一个不可修改的历史活动记录。
2,可回放事件到固定时间点。
3,促进系统适应能力,随着时间发展,新的事件不影响旧的事件。
4,非常适合分布式系统和水平扩展,从而提高了可扩展性和速度。
Event Sourcing Pattern 的缺点
1,需解决 事件版本多样话,向后兼容以达到无缝迁移,包括升级不能擦除历史数据。
2,针对巨大数据量大事件 的读取和存储会造成困难。尤其是需要高效的查询和存储能力。
3,由于最终的一致性,系统的各个组件可能会在不同的时间看到状态变化,这通常是event sourcing 的结果。在处理最终一致性时,处理过时数据、解决冲突和数据同步都需要仔细考虑。
Event Sourcing 用例和应用
Financial Systems - 银行和金融行业
记录交易记录,账户活动,和 compliance events(就是遵守一些法律法规的操作)
健康记录(Healthcare Records)
记录病人的联系方式,治理历史和疗程等。
供应链管理(Supply Chain Management)
用于供应链和物流管理,以跟踪库存变动、运输更新和供应链中断。
电子商务平台(E-commerce Platforms)
记录客户互动、订单履行流程和库存变化的有用工具。这使得跟踪订单、提供定制建议和检查客户行为以提高销售额和客户满意度成为可能。
游戏和虚拟环境(Gaming and Virtual Environments)
以记录玩家动作、游戏状态变化和游戏内购买。
Event Sourcing Pattern 现实例子之银行账户管理系统
Account Operations
每当消费者操作账户,系统都会创建相关事件,例如存款、从账户中取款、将资金转移到另一个账户或更改个人数据。
Event Logging
每个事件中都包含相关详细信息,包括操作类型、涉及金额、时间戳以及重新创建帐户状态所需的任何其他元数据。
Event Processing
这些事件由事件处理程序或处理器使用,然后它们会适当地更改受影响帐户的状态。例如,如果注意到“存款”事件,账户余额就会增加。如果记录了“提款”事件,余额将减少。
Scalability and Resilience
事件源将事件处理分布在多个节点上,使银行的系统能够横向扩展。系统可以通过重放事件存储中的事件来恢复,以便在发生故障或中断时恢复帐户的状态。
用 Event Sourcing Pattern的情况
1,你需要追踪,事情是如何随时间改变的。
2,因法律或审计规定,需记录修改操作的完整历史。
3,就是单纯要记录历史记录,如 financial information。
4,因为异常,可帮你快速跳回到之前状态。
5,微服务间/ 不同组件间 通信需要这些记录。
不用 Event Sourcing Pattern的情况
1,应用不需要记录完整历史,只需记录最近状态。
2,改动太频繁,事件太多,浪费硬盘。
3,复杂系统,一致性要求高, 需额外努力。
4,回放来重建,但性能太差,不能符合要求。