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

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

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

public static class RestBolt implements IRichBolt {
    ...
    @Override
    public void execute(Tuple tuple) {
        String classes = (new Post('http://my.classifier.com', data = tuple.getString(0)));
        _collector.emit(tuple, new Values(classes));
        _collector.ack(tuple);
    }
    ...
}

topologyBuilder.setBolt("rest-bolt", new RestBolt(), 30000);
public static class RestBolt implements IRichBolt {
    ...
    @Override
    public void execute(Tuple tuple) {
        Future<String> classes = (new AsyncPost('http://my.classifier.com', data = tuple.getString(0)));
        _collector.emit(tuple, new FutureValues(classes));
        _collector.ack(tuple);
    }
    ...
}
现在,考虑到这个API,我猜测Storm除了启动30k线程之外别无选择,这可能会很糟糕。我在源代码中看到Storm使用Netty,我想它可以通过使用Storm调用更有效地支持此操作。。。如果存在虚构的美丽的Netty、Storm和Java API,则其外观如下:

public static class RestBolt implements IRichBolt {
    ...
    @Override
    public void execute(Tuple tuple) {
        String classes = (new Post('http://my.classifier.com', data = tuple.getString(0)));
        _collector.emit(tuple, new Values(classes));
        _collector.ack(tuple);
    }
    ...
}

topologyBuilder.setBolt("rest-bolt", new RestBolt(), 30000);
public static class RestBolt implements IRichBolt {
    ...
    @Override
    public void execute(Tuple tuple) {
        Future<String> classes = (new AsyncPost('http://my.classifier.com', data = tuple.getString(0)));
        _collector.emit(tuple, new FutureValues(classes));
        _collector.ack(tuple);
    }
    ...
}
公共静态类RestBolt实现IRichBolt{
...
@凌驾
公共void执行(元组){
未来类=(新的AsyncPost('http://my.classifier.com,data=tuple.getString(0));
_emit(元组,新的未来值(类));
_collector.ack(元组);
}
...
}
有没有一种方法可以使用异步调用在Storm中只有很少线程的情况下实现巨大的可伸缩性