按图索骥成语故事意思 业务流程如何按图索骥?以“事件驱动”架构系统
事件,指对特定的对象产生一定影响的事情。事件既是技术架构概念,也是业务概念。以事件作为行为驱动的编程模型架构,称为事件驱动架构(Event-Driven Architecture,EDA)。在企业的信息化系统建设中,常常可以看到事件驱动的影子,如消息服务总线的设计,面向服务架构的设计等等。
现实生活中的事件,我们可以看成是一连串事件的反馈。警察收到附近失窃的报警事件而出动,司机收到车距过近的警告事件而减速,人们收到今天下雨的预报事件而出门带伞。业务流程是现实操作流程的归纳与统一,故也可以使用事件模型去描述,使用事件驱动主要有以下三种情况:
EDA以事件为媒介,实现组件或服务之间最大松耦合。当组件A执行的逻辑需要触发组件B的逻辑时,不要直接调用它,我们可以将触发事件发送到事件分派器。组件B将侦听调度程序中的特定事件,并在事件发生时执行操作。这意味着A和B都将取决于调度器和事件,但他们之间将不会知道对方存在,它们将被解耦。
比如一个失窃报警事件,发布方可以为报案者,也可以为报案者的邻居;接收方可以是A警察,可以是B警察,也可以是整个警署。报案者无需关心由谁来处理这个案件,只关心我确实已经报案了;警察也无需知道是谁报的案,只关心确认是有这个案件去处理。
理想情况下,调度器和事件都不应该在组件之间存在。组件之间通过事件进行通讯(结构上解耦,行为上耦合)。事件在组件之间共享,是应用程序的核心部分。在领域驱动设计(DDD)中,事件属于共享内核Shared Kernel。组件依赖于共享内核,但彼此不会意识其存在。
有时候一个任务的子任务需要耗费相当长的时间,但我们并不希望其余的子任务要等待当前耗时的子任务执行完毕。在这种情况下,我们希望将其作为异步,或使用多线程去处理该任务。
以上述失窃报警事件为例,警署收到报警进行破案,在这期间,他需要要调查区域A、B、C、D,于是向区域A、B、C、D的分局都转发了失窃报警事件,这样四个地区分局便并行执行调查任务。
大多数应用程序都需要使用数据,而最为典型的使用方式在于随用户使用对数据状态进行更新,从而保持其始终处于最新,如常用的CURD。然而事件驱动模式定义了一种新的事件序列驱动型数据操作处理方法,其中每一事件都被记录在仅附加存储机制内。每个事件代表一组数据变更,应用程序可以随时读取事件的历史记录,并对同该实体相关的所有事件进行回放与消费,借此重新展现该实体特定历史点的状态。
仍以上述失窃报警事件为例,案件是该事件核心处理的对象。警察会在档案上记录该案件的每个环节执行情况 。通过阅读该案件的档案,可以追溯到某一节点的当时案件状态。
结合协作云SRM系统,比如寻源模块的议价流程,采取事件驱动架构,包含以下事件发布与订阅:
对于决标后的操作,传统做法方式是直接在原来的评标方法里面,添加判断,如果该价格被决标,则执行后续的三步副作用操作。而在事件驱动中,则是发布决标事件,同时添加三个决标事件监听器,分别执行后续的三步副作用操作。
这样一来无需改动原有逻辑,二来作为可插拔的方式进行添加,不仅解耦,且允许并行执行。后续三步操作之所以被称为副作用,是因为在当前评标流程中,非必须执行的。
结语
事件可以平衡代码的可维护性与扩展性,提高系统性能,事件溯源也为系统数据提供了可靠性与阅读性。然而,事件驱动是一把双刃剑,在引入实践中,会遇到各种各样的难题,本文篇幅有限便不再展开。这是一条存在自身危险的道路,概念和技术的复杂性在增加,而且任何一种的滥用都会产生灾难性的后果。