
86
|
第
6
章
6.8
再处理与近实时处理
不可变事件流提供了重置消费者组偏移量和从任意时间点重新处理事件的能力。这被称
为
再处理
,每个事件驱动型微服务都需要在设计时考虑再处理问题。通常只有使用事件
时间进行事件处理的微服务要执行再处理,那些依赖于挂钟时间的聚合和窗口化的微服
务则不用。
事件调度是能够正确再处理来自事件流的历史数据的重要部分。它确保了微服务以它们在
近实时处理事件时一样的顺序来处理事件。处理乱序事件也是这个过程中的重要部分,因
为通过事件代理对事件流再分区(而不是使用像
Spark
、
Flink
或
Beam
这样的重量级框架)
会导致乱序事件。
当你想要对事件流进行再处理时,下面是一些可遵循的步骤。
1.
确定起始点
。
作为最佳实践,所有有状态的消费者应该从它们订阅的每个事件流的起
点开始再处理事件。这尤其适用于实体事件流,因为它们包含有关所讨论实体的重要
事实。
2.
确定重置哪些消费者偏移量
。
所有包含用于有状态处理的流的偏移量都应该被重置到流
的起点,因为如果你从一个错误的位置开始再处理,那么很难确保最终能得到正确的状
态。(考虑一下,如果你重新处理某人的银行存款余额,而不小心漏掉了以前的工资支
票,会发生什么情况。)
3.
考虑数据量
。
有些微服务可能要处理大量事件。考虑再处理事件需要花费多长时间,以
及任何可能存在的瓶颈。可能需要采用限额(参见
14.4
节)以确保不会因大量
I/O
而
压垮事件代理。此外,如果预计会产生大量再处理输出数据,则需要通知所有的下游消
费者。如果不具备自动伸缩能力(参见
1
1.7.3 ...