[英]How to do a Kafka Streams Left Join that returns LHS messages that have no corresponding RHS after a fixed period?
我是 Kafka Streams 的新手。 我刚刚在流 A 和流 B 之间建立了一个左连接。在我的设置中,每个 A 都有一个 B,它在 A 之后几毫秒到达,但在现实生活中可能缺少 B,或者 B迟到(说 250 毫秒后)。 我希望能够找到这些(丢失的和迟到的 B)。 我认为这很容易 - 只需在 A 和 B 之间进行左连接,指定窗口,然后完成工作。 但令我惊讶的是,我在左连接流输出中得到了 2 行。 想想看,这是有道理的 - 当 A 到达时,没有 B 并且生成了一个看起来像A-[null]
的连接行。 几毫秒后,B 到达,然后生成AB
。
我想要的是让那些 A 消息在说 100 毫秒后没有相应的 B - B 可能会迟到; 可能永远不会到达; 但它没有在 A 的 100 毫秒内到达。是否有标准模式/惯用方式来做到这一点? 我现在在想,也许我必须让消费者接收 A,然后在设定的时间后触发一条消息(尽管我不确定如果没有一些笨重的同步代码会如何完成),然后我必须在那个(称之为 Ax)和 B 之间加入。
这可能是一个很常见的要求,但它似乎并不像我最初想象的那么容易......任何想法/指针/提示将不胜感激。 谢谢。
好的,我有一些似乎有效的东西。 我需要做的就是,在左连接(当然有一个窗口)之后,做一个.groupByKey().count()
然后我可以发送东西(我认为使用filter()
和branch()
,虽然我还没有这样做)计数 < 2 到一个流(“缺失”),而其他的到另一个“好”流,例如用于分析/计算指标等。
我尝试使用.windowedBy(TimeWindows.of(ofMillis(250)).grace(ofMillis(10)))
和.suppress(Suppressed.untilWindowCloses(unbounded()));
但它无处可去,所以同样好,一个带有计数的 groupBy 是事物外观所需要的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.