
80
|
第
6
章
水位策略也可以用于再分区事件流。
Apache Samza
提供了一个类似于
Kafka
Streams
的独立模式,不过是使用水位而不是流时间。
6.6
乱序事件和迟到事件
在理想世界中,所有事件的生产都不存在问题,且无延时地提供给消费者。遗憾的是,我
们都生活在现实世界中,理想情况永远不会存在,所以必须有应对乱序事件的计划。如果
一个事件的时间戳不等于或不大于事件流中位于它前面的事件的时间戳,就被称为是乱序
的。在图
6-7
中
,事件
F
就是乱序的,因为它的时间戳小于
G
的时间戳;事件
H
也是如此,
它的时间戳小于
I
的时间戳。
(值未展示)
输入事件流—分区0
乱序事件
键
时间
图 6-7:一个事件流分区中的乱序事件
有边界的数据集,比如进行批处理的历史数据,通常对乱序数据有相当强的弹性。可以把
整个批处理想象成一个大的窗口,如果批处理还没有开始,那么以数分钟甚至数小时偏差
乱序到达的事件就不会有真正的影响。在这种方式下,批处理的有界数据集可以产生高确
定性的结果,但这是以高延迟为代价的,特别是对传统的大数据批处理作业来说,这些作
业的结果在
24
小时后才能使用(加上批处理时间)
。
对于无边界的数据集,比如那些持续更新的事件流,开发人员在设计微服务时必须考虑延
迟和确定性的要求。这就从技术需求扩展到了业务需求的范畴,所以任何事件驱动型微服
务开发人员都必须问一句:“我的微服务是否要根据业务需求处理乱序和迟到的事件?”
乱序事件要求业务就如何处理它们做出具体决定,并且确定延迟和确定性的优先级。
考虑一下之前银行账户的例子。无论事件的顺序如何排列,也无论事件迟到多久 ...