背景
事件驱动和定时调度任务,都是为了完成某类具有特定触发条件的业务逻辑。但是也存在较多的不同点。
事件驱动
事件驱动是一种设计思想,把不同业务逻辑用“事件”关联起来,用“事件”来驱动业务或者流程往下走。非常典型的业务,就是工人流水线。第一个工人接受订单,分发到第二个工人,第二个工人选取零配件传递给第三个工人,第三个工人进行组装,组装完毕后传递给第四个工人,第四个人工人包装后,送上车。整条链路就完成了。
这里比较明显的特点是,每个工人理论上来说,无法预估上个工人什么时候完成,只能坐等;另外,每个节点存在一定的性能瓶颈,在某个环节由于处理的速度过慢,会导致较多的积压。
定时任务
定时任务,从名称就可以看到,就是定时指定业务逻辑的任务。明显的特点,就是具有定时性,即到了特定的时间点执行具体的业务。这类非常多,比如常见的闹钟、定时消息推送、淘宝定时确认收货、支付宝定时确认打款给卖家等等。
一般来说,定时任务就是异步的独立调度任务,存在一定的延迟性,当然不同的业务,对延时的要求是不同的。
比如,闹钟延迟个1000毫秒无伤大雅;订单过期延迟个1分钟也没有关系。有的业务则对延迟有严格要求,比如定时秒杀。
架构设计
对于事件驱动来说,只要业务扔出事件,由事件来驱动业务进行则可。那么重要的一点,就是事件源非常重要,即事件驱动必须要保证事件源的稳定性和准确性。同时在大部分情况下,无法保证每个事件可以被及时处理以及保证处理成功。因此在设计时,要保证事件具备重放能力。一般来说,事件可能是从其他非自身的事件源发出,无法要求其他业务方能够重放,因此,系统自身需要对事件做持久化来具备重放能力。
此时,系统自身对事件的重放,则需要使用到定时任务的功能。
当然,如果初始事件源具备重放的能力,则系统自身可以不用设计持久化,只要保证幂等即可。这种纯事件驱动设计就变得非常轻量、优雅。
事件驱动的优点
事件驱动作为一种上手比较困难的设计模型来说,存在较多的优点。最主要的,是资源节约和准实时性。事件驱动替代了轮询式的特点,轮询时必须要保证程序采用高频循环来推动业务继续流转下去。而事件驱动则直接利用监听的方式,来推动业务的流转。