
有状态的流
|
103
如图
7-11
所示,如果生产者在事务执行期间遭遇致命性异常,通过从变更日志恢复,可以
简单地重建其替代实例。事件流的消费者组偏移量也可以被重置到偏移量事件流中最后已
知的处理位置。
消费者
聚合程序
库存变更日志流
库存变动流
应用程序容器
恢复消费
者偏移量
恢复库存表的状态
读写
库存表
0
图 7-11:用变更日志和之前的偏移量从代理恢复状态
生产者一旦恢复运行就可以开始处理新的事务,并且事件代理会认为所有之前未完成的事
务都是失败的并将它们取消。根据代理实现的不同,事务机制在某种程度上会有所不同,
因此请确保了解清楚你所使用的事务机制。
7.6.3
没有
“
客户端
–
代理
”
事务的有效一次处理
对不支持“客户端
–
代理”事务的实现来说,要做到事件的有效一次处理也是可能的,尽
管这需要更多的工作和对重复事件的仔细考虑。首先,如果上游服务无法提供有效一次事
件的生产保证,那么它们就可能产生重复的记录。需要识别并过滤上游进程创建的重复事
件。其次,需要在一个
本地事务
中对状态和偏移量管理进行更新,以确保对系统状态只应
用一次事件处理逻辑。通过遵循此策略,客户端可以确保其处理程序产生的内部状态与输
入事件流的逻辑描述保持一致。下面来更详细地看看这些步骤。
最好使用支持幂等写入的事件代理和客户端,而不是事后解决去重问题。前
者可以很好地扩展到所有的消费者应用程序,后者则成本高昂且难以扩展。
1.
产生重复事件
如果生产者已成功地将事件写入事件流,但是没能接收到写入确认且进行重试,或者在更
新其消费者偏移量之前崩溃,则会产生重复事件。这两种场景有一些不同。 ...