1

背景

Designing Event-Driven Systems一书中,作者强调了业务系统中的一个常见用例,其中需要等待或发生N个事件。

给出的示例是一个订单服务,它需要等待三个单独的验证服务,它们都通过同一个主题发送,以返回一个PASS. (我将其解释为在同一个主题上会有三个具有相同键的验证消息,每个都有一个指示成功或失败的值。)

作者表示,解决方案将采用以下形式(假设计数是基于key的):

  1. 按键分组。
  2. 计算每个键的出现次数(使用通过窗口执行的聚合器)。
  3. 过滤输出以获得所需的计数。

问题

上述每个步骤究竟是如何工作的,涉及哪些类/方法?

  • 特别是第一步(按key分组)是指使用KStream::groupByKey方法吗?
  • 如果是这样,输出将是一个KGroupedStream,并且第二步可能使用Count方法之一并返回一个KTable
  • 但是,有了 KTable,我们如何按照第三步过滤 KTable 上的输出?
4

1 回答 1

0

我想你的假设是正确的。对于第 (2) 步,这取决于,但如果您假设您正在等待的所有消息都具有相同的密钥,并且您只对收到具有相同密钥的三个消息感兴趣,那么调用count()就是您想要的。

作为下一步(即 (3)),您将调用KTable#filter()以获取计数为 3 的所有行。

最后,您可以调用toStream(),每次一个键达到 3 的计数时,此流应该包含一条记录。

(附带说明:默认情况下,所有条目都将KTable永远保留,因此您还需要注意删除在某些时候确实达到 3 的条目。)

于 2020-08-07T22:58:29.543 回答