流处理中的时间
在流数据处理系统中,一条数据实际产生的时间和被系统处理的时间可能不同,因此存在着系统时间和事件时间两种不同的时间概念,下面介绍两种概念的含义和区别。
系统时间
系统时间(System Time)是指正在执行流数据处理所在的服务器上本地时钟的时间。
当流数据处理使用系统时间时,所有基于时间的操作(如时间窗口)将使用运行程序所在机器的本地时钟:
-
一分钟时间窗口的处理数据将包括在系统时钟指示的整分钟之间到达的所有记录。
-
系统时间是最简单的时间概念,能够提供最快的响应,即在窗口结束就可以立即触发计算,因此可以提供最低的延迟。
-
然而,在分布式或异步环境中,使用系统时间处理流数据可能会引入一定误差,因为它受到数据到达系统的延时等因素的影响。
事件时间
事件时间(Event Time)是指事件实际发生的时间。这个时间通常在数据进入流数据处理系统之前就被标记到数据中,每条数据都有事件时间:
-
事件时间不受流数据处理系统所在机器的系统时间影响,基于事件时间的操作是可预测的,并且结果是确定的。
-
使用事件时间进行窗口计算时,无论流数据到达服务器的延时如何,最终都能得到相同的结果。
-
对于一个事件,自其发生时起,事件时间就已经确定不会改变。
由于各种因素的影响,系统时间和事件时间之间可能存在偏差。因此,在实际应用中,使用系统时间能够提供较低的延迟,而使用事件时间则可以保证结果可预测。
流计算引擎中的时间
DolphinDB 流计算引擎默认使用事件时间,即流数据表的时间列(timeColumn)为数据处理的时间依据。流计算引擎提供了参数(useSystemTime)来决定是否使用数据注入引擎时的系统时间作为时间列进行计算。
DolphinDB 流计算引擎中默认使用事件时间,即流数据表的时间列(timeColumn)为数据处理的时间依据。流计算引擎提供了参数(useSystemTime)来决定是否使用数据注入引擎时的系统时间作为时间列进行计算。
-
当 useSystemTime = true 时,计算将基于数据进入引擎的时刻(毫秒精度的本地系统时间,与数据中的时间列无关)。
-
当 useSystemTime = false 时,计算将基于数据中的时间列。
在使用事件时间模式时,由于数据到达服务器可能会有延迟,服务器在事件到达之前无法确定是否所有相关的数据都已到达。例如,当事件时间为 t1 的记录到达时,无法确认事件时间早于 t1 的记录是否全部到达。因此,流计算引擎内部会自动判断窗口关闭的时刻,并维护窗口内的状态。一些流计算引擎为了确保计算能够及时触发,增加了强制触发计算的参数,以防长时间没有新数据导致计算无法启动。例如,时间序列引擎的 updateTime 和 forceTriggerTime;以及某些流数据连接引擎的 maxDelayedTime 。有关具体使用教程,请参见后续章节:内置流式计算引擎。