嗨,我正在尝试运行一个应该处理传入数据的Flink作业,如下所示。在keyBy()
之后的流程操作符中,应该存在根据数据中的某些属性花费太多时间的情况。即使传入数据具有不同的ID(用于keyBy()
流),处理功能中的长处理代码也会阻止其他传入数据。我的意思是整个流。
SingleOutputStreamOperator<Envelope> processingStream = deviceStream
.map(e -> (Envelope) e)
.keyBy((KeySelector<Envelope, String>) value -> value.eventId) // key by scenarios
.process(new RuleProcessFunction());
在RuleProcessFunction.java
:
...
@Override
public void processElement(Envelope value, Context ctx, Collector<Envelope> out) throws Exception {
//handleEvent(value, ctx, out);
if (value.getEventId().equals("I")) {
System.out.println("hello i");
for (long i = 0; i < 10000000000L; i++) {
}
}
out.collect(value);
}
我希望长时间运行的代码块不应该阻塞整个流。我知道有AsyncFunction用于阻止IO情况,但我不知道这是正确的解决方案。
答案 0 :(得分:0)
由于您没有从像Cassandra这样的外部数据库中提取数据,因此我认为您不需要使用AsyncFunction。
使用单一并行操作运行flink作业可能是什么。尝试增加并行性,以便一个核心不负责所有处理以及接收数据。当然,如果你这样做,仍然会有背压。因为负责从源获取数据的核心读取数据的速度比正在运行processFunction的核心更快,因此Flink的背压处理将减慢摄取速度。