
196
|
第
11
章
迟到的旧事件
图 11-9:乱序事件
要让流处理应用程序处理好这些场景,需要做到以下几点。
•
识别乱序的事件。应用程序需要检查事件的时间,并将其与当前时间进行比较。
•
规定一个时间段用于重排乱序的事件。比如
3
个小时以内的事件可以重排,但
3
周以外
的事件就可以直接扔掉。
•
具有在一定时间段内重排乱序事件的能力。这是流式处理应用与批处理作业的一个主要
不同点。假设有一个每天运行的作业,一些事件在作业结束之后才到达,那么可以重新
运行昨天的作业来更新事件。而在流式处理中,“重新运行昨天的作业”这种情况是不
存在的,乱序事件和新到达的事件必须一起处理。
•
具备更新结果的能力。如果处理的结果保存到数据库里,那么可以通过
put
或
update
对
结果进行更新。如果流应用程序通过邮件发送结果,那么要对结果进行更新,就需要很
巧妙的手段。
有一些流式处理框架,比如
Google
的
Dataflow
和
Kafka
的
Streams
,都支持独立于处理时
间发生的事件,并且能够处理比当前处理时间更晚或更早的事件。它们在本地状态里维护
了多个聚合时间窗口,用于更新事件,并为开发者提供配置时间窗口大小的能力。当然,
时间窗口越大,维护本地状态需要的内存也越大。
Streams API
通常将聚合结果写到主题上。这些主题一般是压缩日志主题,也就是说,它
们只保留每个键的最新值。如果一个聚合时间窗口的结果需要被更新为晚到事件的结果,
Streams
会直接为这个聚合时间窗口写入一个新的结果,将前一个结果覆盖掉。
11.3.7
重新处理 ...