我有几个独立的系统,它们根据预定义的流程协同工作来执行任务。
在 ADX 中,我有一个表,其中包含来自这些系统的状态消息。状态消息不同步并且会受到一定的抖动的影响。 (见下表和图)。现在我想重建流程周期。
一个流程,例如,系统1必须从离线变为在线,然后系统2从离线变为在线,然后系统2再次从在线变为离线,最后系统1从在线变为离线,如此循环一个过程完成了,参见下图。
我能够使用扫描操作符检测这些进程,并在我的时间序列中识别它们,请参阅下面的代码片段。
为了能够异步执行复杂的计算,我想在物化视图中执行查询,但这些不支持序列化数据。
有没有办法,例如使用行顺序策略,仍然在物化视图中使用扫描运算符? 我也非常感谢有关替代解决方案的建议。
时间戳 | 系统 | 状态 |
---|---|---|
YYYY-MM-DDTHH:MM:SS | S1 | 离线 |
YYYY-MM-DDTHH:MM:SS | S2 | 离线 |
YYYY-MM-DDTHH:MM:SS | S2 | 离线 |
YYYY-MM-DDTHH:MM:SS | S1 | 离线 |
YYYY-MM-DDTHH:MM:SS | S1 | 在线 |
scan with_match_id=match_id declare (phase: int, session_start: datetime , session_end: datetime) with
(
step s1:
system == "S1" and status == "offline"
=> phase = 1;
step s2:
system == "S2" and status == "offline"
=> phase = 2;
step s3:
system == "S1" and status == "online"
=> phase = 3;
step s4:
system == "S2" and status == "online"
=> phase = 4, session_start = iff(isnull(s4.session_start), timestamp, s4.session_start);
step s5:
system == "S1" and status == "offline"
=> phase = 5;
step s6:
system == "S2" and status == "offline"
=> phase = 6, session_end = iff(isnull(s6.session_end), timestamp, s6.session_end);
)
| project timestamp, match_id, session_start, session_end, phase
| where phase in (4, 6)
| summarize take_any(session_start), take_any(session_end) by match_id
不,物化视图不支持扫描操作符,因为物化视图不支持序列化,而扫描需要序列化。您是否考虑过在查询期间运行查询,而不是使用物化视图在后台物化它?查询是否执行得不够好,因此您考虑了物化视图?最好的选择是优化查询并在查询期间运行所有内容。如果这不是一个选项,那么您可以编排一个离线进程,该进程定期运行查询并使用从查询命令摄取将结果附加到另一个表中 (
.set-or-append
)