进行REST调用的风暴转换(async,Future,Netty)

时间:2016-08-11 23:11:55

标签: asynchronous netty apache-storm

让我们假设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中极少数线程的大规模可伸缩性?

0 个答案:

没有答案