事件驱动与流处理:原理、优势与应用
1. 命令与事件的区别
在事件溯源哲学中,事件和命令有着明确的区分。当用户请求首次到达时,它最初是一个命令,此时该请求仍有可能失败,例如违反了某些完整性条件。应用程序必须首先验证是否可以执行该命令。若验证成功且命令被接受,它就会转变为一个事件,而事件是持久且不可变的。
例如,用户尝试注册特定用户名,或预订飞机、剧院的座位时,应用程序需要检查该用户名或座位是否已被占用。当检查成功后,应用程序会生成一个事件,表明特定用户 ID 注册了特定用户名,或者特定座位已为特定客户预订。一旦事件生成,它就成为一个既定事实。即便客户后来决定更改或取消预订,他们曾预订该座位这一事实依然存在,而更改或取消操作则是后续添加的另一个事件。
事件流的消费者不能拒绝事件,因为当消费者看到事件时,它已经是日志中不可变的一部分,并且可能已被其他消费者看到。因此,对命令的任何验证都需要在它成为事件之前同步进行,例如使用可序列化事务,原子性地验证命令并发布事件。或者,也可以将预订座位的用户请求拆分为两个事件:首先是临时预订,然后在预订验证通过后再生成一个单独的确认事件。
2. 状态、流与不可变性
批处理受益于输入文件的不可变性,这使得我们可以在现有输入文件上运行实验性处理作业而无需担心损坏它们。这种不可变性原则也是事件溯源和变更数据捕获强大的原因。
通常,我们认为数据库存储应用程序的当前状态,这种表示方式针对读取进行了优化,便于服务查询。然而,状态是会变化的,所以数据库支持数据的插入、更新和删除操作。那么,这与不可变性如何兼容呢?
任何变化的状态都是随时间变化的事件的结果。例如,当前可用座位列表是处
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



