Siddhi:状态持久性和实时可查询状态?

时间:2018-12-09 11:54:31

标签: wso2 siddhi

我的情况就是这样。

我想查看/查询活动处理窗口中特定查询的当前聚合值是什么。

我在Apache Flink中看到了这一点。

例如:

说我有一个查询来统计失败的总数,每12小时就会出现一次窗口。我想(从另一个应用程序中)询问主动汇总窗口当前计数是多少。请注意,活动窗口仍在处理中。

原因是我的应用程序需要向用户提供有关其当前总故障计数的反馈。因此他/她可以据此采取行动。从用户的角度来看,等待直到窗口被处理然后获得计数,这并不是期望的行为。

这可能吗?如果可以,怎么办?

1 个答案:

答案 0 :(得分:0)

一种选择是使用rolling time window。滚动时间窗口将为您提供给定时间范围内的滚动聚合(总和,计数等)。因此,对于每个传入事件,您都会获得带有计数的输出事件。您可以使用它来提供反馈。这种方法有两个陷阱。一个是滚动计数而不是批次计数。另一个是通过事件触发流程以计数流。如果您要根据其他要求(例如,用户启动,每小时等)触发反馈,则此方法将不起作用。为此,您需要使用以下方法。

使用time batch window,然后将其与另一个流结合,该流将根据业务需求而被触发。下面是一个示例,这里是testcases供您参考。

from countStream#window.timeBatch(12 hrs) right outer join 
feedbackTriggerStream#window.length(1)
select count() as totalFailures
insert into FeedbackStream;

另一种选择是使用query功能。如果您将Siddhi用作库并且可以访问SiddhiAppRuntime,则此方法适用。下面是一个代码示例。假设下面是您的窗口查询以计算计数。

define countWindow(userid string, reason string) timeBatch(12 hrs);

From countStream
Select *
Insert into countWindow;

然后,您可以使用以下查询来访问窗口数据。

Event[] events = siddhiAppRuntime.query(
"from countWindow " +
"select count() as totalCount ");

事件将包含一个带计数的事件。这是对testcases的引用。