
精确一次性语义
|
139
8.2.1
事务的应用场景
一些流式处理应用程序对准确性要求较高,特别是如果处理过程包含了聚合或连接操作,
那么事务对它们来说就会非常有用。如果流式处理应用程序只进行简单的转换和过滤,那
么就不需要更新内部状态,即使出现了重复消息,也可以很容易地将它们过滤掉。但是,
如果流式处理应用程序对几条消息进行了聚合,一些输入消息被统计了不止一次,那么就
很难知道结果是不是错误的。如果不重新处理输入消息,则不可能修正结果。
金融行业的应用程序就是典型的复杂流式处理的例子,在这些应用程序中,精确一次性被
用于保证精确的聚合结果。不过,因为可以非常容易地在
Streams
应用程序中启用精确一
次性保证,所以已经有非常多的应用场景(如聊天机器人)启用了这个特性。
8.2.2
事务可以解决哪些问题
假设有一个简单的流式处理应用程序:它从源主题读取消息,然后可能会对消息做一些处
理,再将结果写入另一个主题。我们想要确保处理的每一条消息的结果只被写入一次。那
么,哪些地方有可能出错呢?
事实证明,很多地方有可能出错。下面来看看其中的两种情况。
1.
应用程序崩溃导致的重复处理
在从源集群读取并处理了消息之后,应用程序必须做两件事:一是将结果写入输出主题,
二是提交已处理的消息的偏移量。假设这两个动作就按照这个顺序发生。如果应用程序在
发送结果之后发生崩溃,但偏移量还没有提交,该怎么办?
第
4
章讨论过当消费者崩溃时会发生什么
。几秒之后,因为没有心跳,所以将触发再均
衡,消费者读取的分区将被重新分配给其他消费者。新消费者将从最后提交的偏移量的位 ...