我计划使用 flink 流创建一个规则引擎。
执行上有一些要求:
- 所有要针对规则集执行的事件都必须从 kafka 读取。
- 所有规则都必须在有限的时间内执行。
问题是可以在运行时添加规则,因此我不能简单地创建大量作业来处理所有传入消息,因为我有超过允许执行规则的最长时间的风险。
我保证单个规则可以在时限内执行。
所以我想知道按照规则创建一项工作并在新规则到来时添加更多工作是否是一种好的做法? (这可能是数百条规则)。
我的直觉是这不是解决问题的方法,但没有任何真正合理的理由来解释原因。
第二种方法是维护一个队列(例如在zookeeper中)来跟踪针对哪个事件执行了哪个规则。所以每项工作的工作仅包括:
- 在队列中选择一条规则
- 针对事件执行它
- 再次执行此操作,直到针对该事件执行了所有规则
最佳答案
如果您想动态调整程序逻辑,您可以使用 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
}
}
关于apache-flink - 在 Flink 集群中创造大量工作是一个好的实践吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39853786/