Apache flink Flink上的非阻塞流媒体

Apache flink Flink上的非阻塞流媒体,apache-flink,Apache Flink,嗨,我正在尝试运行一个Flink作业,它应该按如下方式处理传入的数据。在keyBy()之后的流程操作符中,根据数据中的某些属性,应该存在花费太多时间的情况。即使传入数据具有不同的ID(用于流中的keyBy()),流程中的长处理代码功能也会阻止其他传入数据。我是说整条小溪 SingleOutputStreamOperator<Envelope> processingStream = deviceStream .map(e -> (Envelope) e) .key

嗨,我正在尝试运行一个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());

我希望长时间运行的代码块不应该阻塞整个流。我知道有AsyncFunction用于阻止IO情况,但我不知道这是正确的解决方案

因为您不需要像Cassandra这样从外部数据库中提取数据,所以我认为您不需要使用异步函数


您正在以单一并行方式运行flink作业可能是什么情况。尝试增加并行性,使一个内核不负责所有的处理和接收数据。当然,如果你这样做,仍然会有背压。因为,如果负责从源接收数据的内核读取数据的速度比运行processFunction的内核快,Flink的背压处理将减慢接收速度。

谢谢@Jicaar,如果我在processFunction的processElement(..)中使用ListenableFuture或CompletableFuture会怎么样具有固定线程池ExecutionService的方法。这合理吗?未来上市公司应该给你你想要的。老实说,我没有使用CompletableFuture,所以我不知道两者之间的利弊。是的,我认为这是合理的。状态(ValueState,MapState),它们是线程安全的吗?当我使用异步方法时,我需要访问进程操作符的状态,所以它需要接近竞争条件之类的问题。
...
@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);
}