同步来自多个数据源的数据

sga*_*zvi 8 synchronization distributed-system stream-processing apache-kafka iot

我们的团队正在尝试建立一个预测性维护系统,其任务是查看一组事件并预测这些事件是否描绘了一组已知异常。

我们正处于设计阶段,当前的系统设计如下:

  • 这些事件可能发生在物联网系统的多个来源(例如云平台,边缘设备或任何中间平台)上
  • 这些事件由数据源推送到消息队列系统中(当前,我们选择了Apache Kafka)。
  • 每个数据源都有其自己的队列(Kafka主题)。
  • 从队列中,数据被多个推理引擎(实际上是神经网络)消耗。
  • 根据功能集,推理引擎将订阅多个Kafka主题,并从这些主题中流式传输数据以连续输出推理。
  • 总体架构遵循单一责任原则,这意味着每个组件都将彼此分离并在单独的Docker容器中运行。

问题:

为了将一组事件分类为异常,这些事件必须在同一时间窗口内发生。例如,说有三个数据源将各自的事件推送到Kafka主题中,但是由于某些原因,数据未同步。因此,其中一个推理引擎会从每个kafka主题中提取最新条目,但是所提取数据中的相应事件并不属于同一时间窗口(例如1小时)。由于数据不同步,将导致无效的预测。

我们需要弄清楚如何确保按顺序推送来自所有三个源的数据,以便当推理引擎从多个kakfa主题请求条目(例如最后100个条目)时,每个主题中的对应条目都属于同一时间窗口?

Gio*_*ous 1

我建议使用KSQL,它是一个流式 SQL 引擎,可以针对 Apache Kafka 进行实时数据处理。它还为窗口聚合等提供了很好的功能。

在 KSQL 中定义Windows有 3 种方法:

跳跃窗口、翻滚窗口和会话窗口。跳跃和翻滚窗口是时间窗口,因为它们是由您指定的固定持续时间定义的。会话窗口根据传入数据动态调整大小,并通过由不活动间隙分隔的活动周期来定义。

在您的上下文中,您可以使用 KSQL 使用Windowed Joins查询和聚合感兴趣的主题。例如,

SELECT t1.id, ...
FROM topic_1 t1
INNER JOIN topic_2 t2
WITHIN 1 HOURS
ON t1.id = t2.id;
Run Code Online (Sandbox Code Playgroud)