流处理中的时间

在流数据处理系统中,一条数据实际产生的时间和被系统处理的时间可能是不同的,因此在流处理中存在着系统时间和事件时间两种不同的时间概念,下面介绍两种概念的含义和区别。

系统时间

系统时间(System Time)是指正在执行流数据处理所在的服务器上本地时钟的时间。

当流数据处理使用系统时间时,所有基于时间的操作(如时间窗口)将使用运行程序所在机器的本地时钟:

  • 一分钟时间窗口的处理数据将包括在系统时钟指示整分钟的时间之间到达的所有记录

  • 系统时间是最简单的时间概念,不需要流和机器之间的协调,提供了最好的性能和最低的延迟

  • 但是,在分布式和异步环境中,系统时间处理流式数据会引入一定误差,因为它会受到数据到达系统的延时等因素的影响

事件时间

事件时间(Event Time)是指事件实际发生的时间。这个时间通常在数据进入流数据处理系统之前就被标记到数据中,每条数据都有对应的事件时间:

  • 事件时间不受流数据处理系统所在机器的系统时间影响,基于事件时间的操作是可预测的,并且结果是确定的

  • 使用事件时间窗口计算时,无论流数据到达服务器的延时如何,最终都能得到相同的结果

  • 对于一个事件,自其发生起事件时间就已经确定不会改变

由于各种因素的影响,系统时间和事件时间之间可能存在偏差,因此在实际应用中,使用系统时间能够提供较低的延迟,而使用事件时间则可以保证结果可预测。

DolphinDB 流计算引擎中的时间

DolphinDB 流计算引擎中默认使用事件时间,即流数据表的时间列(timeColumn)为数据处理的时间依据。流计算引擎提供了参数(useSystemTime)来决定是否使用数据注入引擎时的系统时间作为时间列进行计算。

  • useSystemTime = false 时,按照数据中的时间列进行计算。

  • useSystemTime = true 时,按照数据进入引擎的时刻(毫秒精度的本地系统时间,与数据中的时间列无关)进行计算。

流数据中的延时问题和处理方法

在使用事件时间的模式下,数据的时间更准确,但由于数据到达服务器会有延迟,且在事件到达之前,服务器无法确定是否有数据发生了延迟,因此部分需要根据窗口触发计算的流计算引擎增加了强制触发计算的参数,用于对长时间没有新数据进入导致一直不触发计算的分组强制触发计算,例如时间序列引擎的 updateTimeforceTriggerTime;部分流数据连接引擎的 maxDelayedTime 等,具体使用教程可以查看后续章节:内置流式计算引擎。