【问题标题】:Best topology for joining data from multiple sensors连接来自多个传感器的数据的最佳拓扑
【发布时间】:2025-12-27 06:05:07
【问题描述】:

我有 n 个传感器每 t 分钟针对自己的主题生成测量值,如下所示:

Topic_1: {timestamp: 1, measurement: 1}, {timestamp: 2, measurement: 4}, ...

Topic_2: {timestamp: 1, measurement: 5}, {timestamp: 2, measurement: 3}, ...
 
Topic_n: {timestamp: 1, measurement: 3}, {timestamp: 2, measurement: 5}, ...

这个传感器数量是动态的,但为了简单起见,我们假设我有 3 个传感器,因此,每 t 分钟有 3 个主题获取数据。

如下所示,加入具有相同时间戳的所有测量的最佳拓扑是什么?

{timestamp: 1, measurement: 1} 
{timestamp: 1, measurement: 5}  --------> {timestamp: 1, measurements: [1,5,3]}
{timestamp: 1, measurement: 3}

【问题讨论】:

    标签: apache-kafka streaming apache-kafka-streams


    【解决方案1】:

    您有几个选择。您可以使用 join 并定义一个 joiner 来制作列表。但是,它必须是连接后的窗口流。如果您的测量总是在宽限期内进行,那么这应该不是问题。

    编辑:(如果主题的数量可以变化,则它不适用于连接,而是您需要使用模式订阅然后聚合)

    稍微复杂一点,如果您的时间戳没有重复项,您可以 groupByKey 然后聚合到列表中。这将形成一个包含您想要的结果的表格。如果您需要它成为一个流,您可以使用 toStream 并过滤掉没有长度为 n 的列表的更新。

    可能还有其他几种方法可以做到这一点,但首先想到的是这些。

    【讨论】:

    • 鉴于输入主题的数量可能会有所不同,我认为加入是行不通的。相反,您需要使用模式订阅订阅单个流中的所有主题,并相应地对数据进行窗口聚合。
    • 这是一个很好的@MatthiasJ.Sax。我没想到,我更新了答案