在flink集群中创建大量作业是一种好习惯吗?

时间:2016-10-04 13:35:14

标签: apache-flink

我打算用flink流创建一个规则引擎。

执行有一些要求:

  • 必须从kafka中读取针对规则集执行的所有事件。
  • 所有规则必须在有限的时间内执行。

问题是可以在运行时添加规则,因此我不能简单地创建大量作业来处理所有传入的消息,因为我有可能超过允许执行规则的最大时间。

我保证可以在时间限制内执行单个规则。

所以我想知道按规则创建一份工作并在新规则到来时增加更多工作是一个好习惯吗? (这可能是一百条规则)。

我有直觉认为这不是解决问题的方法,但解释原因并不合理。

第二种方法是维护一个队列(例如在zookeeper中),以便跟踪哪个规则已针对哪个事件执行。所以每项工作的工作只包括:

  • 在队列中选择规则
  • 针对事件执行
  • 再次执行,直到针对事件执行了所有规则

1 个答案:

答案 0 :(得分:0)

如果要动态调整程序逻辑,可以使用co-flatmap运算符。 co-flatmap运算符有两个输入,一个是正常事件输入,另一个是规则输入。在内部,您将存储规则并将其应用于来自其他输入的传入事件。

以下内容可能如下:

DataStream<Input> input = ...
DataStream<Rule> rules = ...

input
  .connect(rules)
  .keyBy(keySelector1, keySelector2)
  .flatMap(new MyCoFlatMap());

public static class MyCoFlatMap implements CoFlatMapFunction<Input, Rule, Output> {

    @Override
    public void flatMap1(Input input, Collector<Output> collector) throws Exception {
        // process input
    }

    @Override
    public void flatMap2(Rule rule, Collector<Output> collector) throws Exception {
        // store rules
    }
}