complex-event-processing - 使用外部窗口时间戳调试 Siddhi 流查询
问题描述
我计划使用历史事件跟踪(存储在 JSON 中,并为每个事件记录我自己的事件时间戳)来调试我刚刚创建的 Siddhi 流查询。我的直播开始于:
从 MyInputEventStream#window.externalTime(my_own_timestamp, 10 min) 选择 some_fields 插入 MyOutpuStream;
我将从痕迹中一一输入我的事件。
假设事件 1 到达指定的 my_own_timestamp = 1528905600000,即太平洋标准时间 6 月 13 日上午 9 点。而事件 2 在 11 分钟后到达,my_own_timestamp = 1528906260000。我相信我会在上午 9:10 在 MyOutpuStream 获得输出,因为time_stamp(e2) - time_stamp(e1) > 10 min,并且e2会在windows过去后触发系统。
现在假定事件 1 到达 my_own_timestamp = 1528905600000,即上午 9:00。但在接下来的 2 小时内不会有任何事件发生。我是否仍然在上午 9:10 获得输出,因为实际上,窗口时间应该在上午 9:10 到期,与下一个事件何时到达无关?但似乎在这种情况下,Siddhi 的内部计时系统将不得不合并我的事件输入的时间戳,然后根据运行 Siddhi 的进程的时钟系统设置事件的到期时间。这个对吗?你能帮忙澄清一下吗?
解决方案
您不会在上午 9:10 获得输出。因为如果您使用 externalTime,事件过期逻辑将完全基于您定义的时间戳。并且它会等待一个满足时间差的时间戳大于或等于前一个事件过期。
内部发生的是;
def array previousEvents;
foreach currentEvent in currentEvents (events that are coming in):
def currentTime = currentEvent.timestamp;
foreach previousEvent in previousEvents:
def previousTime = previousEvent.timestamp;
def timeDiff = previousTime - currentTime + windowLength;
if (timeDiff <= 0) {
remove previousEvent from previousEvents;
set expired timestamp of previousEvent to currentTime;
expire previousEvent;
}
previousEvents.add(currentEvent);
推荐阅读
- python - Python在二维字典中追加值
- php - SQL:如何在 SQL 中过滤 (WHERE) 连接 (ON) 表?
- c# - 如何在 OWIN 中间件中捕获 SecurityTokenExpiredException?
- python - Pytest BDD - 一个具有多个场景的功能文件
- c# - 在以“管道”开头的字符串中查找连续行
- node.js - 节点 Cheerio 返回 null
- sql - 从列中添加值
- json - 导入本地 JSON 文件时无法读取未定义的属性 - Angular/Ionic
- javascript - 如何创建循环变量以在 axios 调用中使用?
- html - 使用 Selenium 查看元素来源列表?