让我们假设Storm每秒接收1000条推文的流,并且在此过程中的某个地方,它需要将它们归类为垃圾邮件。我有一群例如20台通过REST API提供“分类”微服务的机器,它们可以提供每秒10k条推文的最大吞吐量,并且它们的延迟为3秒。这意味着在最坏的情况下,我可能会有30k的推文即可,这没关系。我想要从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);
现在,考虑到这个API,我的猜测是Storm除了启动30k线程之外别无选择,这可能会很糟糕。我在源代码中看到Storm使用Netty,我猜它可以通过使用Storm调用更有效地支持这个操作......如果存在虚构的漂亮的Netty,Storm和Java API,这将看起来像这样:
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);
}
...
}
有没有办法使用异步调用来获得Storm中极少数线程的大规模可伸缩性?