Asynchronous 执行REST调用的Flink转换(异步、未来、Netty)

Asynchronous 执行REST调用的Flink转换(异步、未来、Netty),asynchronous,netty,apache-flink,Asynchronous,Netty,Apache Flink,让我们假设Flink每秒接收1000条推文,在这个过程中的某个地方,它需要将它们归类为垃圾邮件或非垃圾邮件。我有一个集群,例如20台机器,通过REST API提供“分类”微服务,它们可以提供每秒10k推文的最大吞吐量,延迟为3秒。这意味着,在最坏的情况下,我可能会有3万条推特在飞,这没关系。我猜,要使用Flink提供的服务,实现如下: public class Classifier implements MapFunction<Tweet, TweetWithClass> { @

让我们假设Flink每秒接收1000条推文,在这个过程中的某个地方,它需要将它们归类为垃圾邮件或非垃圾邮件。我有一个集群,例如20台机器,通过REST API提供“分类”微服务,它们可以提供每秒10k推文的最大吞吐量,延迟为3秒。这意味着,在最坏的情况下,我可能会有3万条推特在飞,这没关系。我猜,要使用Flink提供的服务,实现如下:

public class Classifier implements MapFunction<Tweet, TweetWithClass> {
  @Override
  public TweetWithClass map(Tweet tweet) {
    TweetWithClass twc = new TweetWithClass(tweet);
    twc.classes = (new Post('http://my.classifier.com', data = tweet.body)).bodyAsStringArrayFromJson();
    return twc;
  }
}

DataSet<TweetWithClass> outTweets = inTweets.map(new Classifier()).setParallelism(30000);
public class Classifier implements MapFunction<Tweet, TweetWithClass> {
  @Override
  public Future<TweetWithClass> map(Tweet tweet) {
    Future<String[]> classes = (new NettyPost('http://my.classifier.com', data = tweet.body)).asyncBodyAsStringArrayFromJson();
    return classes.onGet( (String[] classes) -> new TweetWithClass(tweet, twc.classes) );
  }
}

DataSet<TweetWithClass> outTweets = inTweets.nettyMap(new Classifier()).setMaxParallelism(30000);
公共类分类器实现MapFunction{
@凌驾
使用类映射的公共Tweet(Tweet Tweet){
TweetWithClass twc=新TweetWithClass(tweet);
twc.classes=(新职位('http://my.classifier.com”,data=tweet.body)).bodyAsStringArrayFromJson();
返回twc;
}
}
DataSet outTweets=inTweets.map(新分类器()).setParallelism(30000);
现在,考虑到这个API,我猜测Flink除了启动30k线程之外别无选择,这可能会很糟糕。我在Flink使用Netty的源代码中看到,我想它可以通过使用异步调用更有效地支持此操作。。。如果存在虚构的美丽的Netty、Flink和Java API,则其外观如下:

public class Classifier implements MapFunction<Tweet, TweetWithClass> {
  @Override
  public TweetWithClass map(Tweet tweet) {
    TweetWithClass twc = new TweetWithClass(tweet);
    twc.classes = (new Post('http://my.classifier.com', data = tweet.body)).bodyAsStringArrayFromJson();
    return twc;
  }
}

DataSet<TweetWithClass> outTweets = inTweets.map(new Classifier()).setParallelism(30000);
public class Classifier implements MapFunction<Tweet, TweetWithClass> {
  @Override
  public Future<TweetWithClass> map(Tweet tweet) {
    Future<String[]> classes = (new NettyPost('http://my.classifier.com', data = tweet.body)).asyncBodyAsStringArrayFromJson();
    return classes.onGet( (String[] classes) -> new TweetWithClass(tweet, twc.classes) );
  }
}

DataSet<TweetWithClass> outTweets = inTweets.nettyMap(new Classifier()).setMaxParallelism(30000);
公共类分类器实现MapFunction{
@凌驾
公共未来地图(推特){
未来类=(新的NettyPost('http://my.classifier.com,data=tweet.body)).asyncBodyAsStringArrayFromJson();
return classes.onGet((String[]classes)->new-TweetWithClass(tweet,twc.classes));
}
}
DataSet outTweets=inTweets.nettyMap(新分类器()).setMaxParallelism(30000);

有没有一种方法可以使用异步调用在Flink中只有很少线程的情况下实现巨大的可伸缩性?

我知道这是一个相对老的问题,但从Flink 1.2(2017年2月发布)开始,Flink提供了一个API,正好用于此目的。 它被称为异步I/O

使用异步I/O,您可以对外部数据库或外部web服务执行异步调用,并在将来通过回调获得结果


更多信息可在此处找到:

如何在映射函数中使用而不是作为数据源