在Flink CEP中是否有解决方法来处理多个“时间约束”?

时间:2018-08-07 12:18:44

标签: flink-streaming flink-cep

如CEP文档(https://ci.apache.org/projects/flink/flink-docs-release-1.5/dev/libs/cep.html中所述,在模式序列中仅允许一个时间约束,我正在努力寻找一种方法来处理包含2个时间约束的业务案例。

我需要监视一些业务事件并就符合以下规则的事件发出警报:

  1. 注册了新帐户
  2. 该帐户在注册后的5分钟内通过身份验证
  3. 该帐户在接下来的1小时内完成了至少2笔交易,交易金额大于1000.00。

代码是这样的:

Pattern<Event, ?> pattern = Pattern.<Event>begin("register").where(new SimpleCondition<Event>() {
    @Override
    public boolean filter<Event value> throws Exception {
        return (value.getEventType() == EventType.REGISTER);
    }
}).followedBy("authentication").where(new SimpleCondition<Event>() {
    @Override
    public boolean filter<Event value> throws Exception {
        return (value.getEventType() == EventType.AUTHENTICATION);
    }
}).where(new IterativeCondition<Event>() {
    @Override
    public boolean filter(Event value, Context<Event> ctx) throws Exception {
        for (Event event : ctx.getEventsForPattern("register")) {
            if (value.getEventTime() - event.getEventTime() <= 1000 * 60 * 5) {
                return true;
            }
        }
        return false;
    }
}).followedBy("transaction").where(new SimpleCondition<Event>() {
    @Override
    public boolean filter<Event value> throws Exception {
        return (value.getEventType() == EventType.TRANSACTION && value.getAmount() > 1000.00);
    }
}).where(new IterativeCondition<Event>() {
    @Override
    public boolean filter(Event value, Context<Event> ctx) throws Exception {
        for (Event event : ctx.getEventsForPattern("authentication")) {
            if (value.getEventTime() - event.getEventTime() <= 1000 * 60 * 60) {
                return true;
            }
        }
        return false;
    }
}).timesOrMore(2);

您可以看到我使用2 IterativeConditions处理时间约束。有没有更好的方法来使代码更简洁?

1 个答案:

答案 0 :(得分:0)

正如您所说,您现在只能在CEP库中将一个时间约束应用于整个模式。但是,您可以做的是将模式分成2个子模式。首先应用模式,该模式将查找REGISTER-> AUTHENTICATE并从中生成复杂事件(将其命名为REGISTER_AUTHENTICATED)。然后以后续模式REGISTER_AUTHENTICATED-> 2 * TRANSACTIONS使用它。

然后,您可以将两个时间限制应用于这两种模式。