事件驱动模式详解 - InfoQ: Software Development …2018-12-14 06:11

——

大多数应用程序都需要使用数据,而最为典型的使用方式在于随用户使用对数据状态进行更新,从而保持其始终处于最新。举例来说,在传统的创建、读取、更新与删除(简称CRUD)模式当中,典型的数据流程为自存储机制内读取数据、对数据进行修改、利用新值对数据当前状态进行更新更新方式通常采用需要锁定数据的事务。这些事件长期驻留在事件存储之内并作为与数据当前状态相关的记录系统存在(即权威数据源)。事件存储通常会发布这些事件以面向消费方交付通知,并可据此进行处理。举例来说,消费方可以将事件中的操作应用于其它系统任务,或者用以执行完成该操作所必需的其它相关操作。需要注意的是,这部分生成事件的应用程序代码与描述各事件的系统并不存在耦合关系。作为事件存储所发布事件的典型使用方式,我们通常需要维护应用程序对各实体作出变更时的物化视图,并可将其与外部系统相集成。举例来说,一套系统可以保留一份用于填充UI内各部分之客户命令的视图。随着该应用程序添加更多新命令,对命令内的条目进行添加或移除,或者添加其它发布信息,这些用于描述对应变更的事件可接受处理并用于更新这份物化视图。另外,应用程序可以随时读取事件的历史记录,并对同该实体相关的所有事件进行回放与消费,借此重新实现该实体的当前状态。我们可以在处理请求时建立域对象或者经由一套计划内任务实现这样的效果,意味着目标实体的状态可作为物化视图进行存储以支持表示层。仅附加事件存储机制还提供审计追踪能力,可通过事件随时回放以监控指向数据存储的操作,将当前状态重新生成为物化视图或预测,从而协助实现系统测试与调试。另外,要求使用补偿性事件以撤销变更的要求则带来可供检索的变更历史记录这一点在直接存储当前状态的模式当中显然无法实现。事件列表亦可用于分析应用程序性能并检测用户活动趋势,或者获取其它具有现实意义的业务信息。事件存储负责提供事件,而任务则根据这些事件进行响应式执行。将任务从事件当中解耦出来能够提升灵活性与可扩展性。任务能够获取事件类型与事件数据,但无法获得触发该事件的具体操作。另外,可由多项任务同时处理单一事件。这意味着我们能够轻松将事件存储提供的事件同与之相关的监听服务及系统加以集成。然而,事件驱动类事件往往处于较低层级,我们可能需要生成特定集成事件加以替代。事件发布可能发生至少一次,因此该事件的消费方必须为幂等。如果该事件被处理多次,则绝不可重复使用事件中描述的更新状态。举例来说,如果某一消费方的多个实例始终聚合某实体的属性例如订单总量,则必须要在订单下达成功时方可进行聚合增量。虽然这并不属于事件驱动机制的关键性特征,但在实践使用当中却非常常见且至关重要。希望记录所发生事件,且能够通过回放实现系统恢复、变更回滚或者保留历史及审计日志时。举例来说,如果某一任务涉及多个步骤,您可能需要执行相关操作以不愿更新,并稍后回放部分步骤以确保数据回归一致状态。

威尼斯人网址 Power by DeDe58 百度