2011-09-12 23 views
5

我们有一个给定一批请求的系统,可以对外部第三方API进行等量的调用。鉴于这是一个I/O绑定任务,我们目前使用大小为20的缓存线程池来处理这些请求。除以上,是解决:与多个核(较少上下文切换,能够支持多个并发线程)为大量外部API请求扩展软件/硬件?

使用多个机器

使用机器更少通过利用商品/廉价硬件(披萨盒)

我们每天收到的请求的数量是百万。

我们使用Java,所以这里的线程是内核,而不是“绿色”。

其他点数/思考:

  • Hadoop是常用于这种性质的问题,但这个需要是实时与刻板的离线数据挖掘。
  • 的API请求是200ms至2秒的平均
  • 采取任何地方有要求
  • 第三方的问题是能够服务更多的要求比我们所能火(支付供应商)之间没有共享的状态。
+0

您是否有共享状态,用于处理请求?如果是这样,它变化的频率如何?这个共享状态的大小是多少? –

+1

第三方API的限制是什么?如果您调用的API仍然是瓶颈,那么扩展您的堆栈就没有意义了。你可以缓存你从它接收到的数据,还是使用来自一个服务/同时为你的许多客户提供的数据? – Paolo

+0

编辑我原来的帖子回答上面的问题。这些调用是完全独立的,所以没有要缓存的数据。 – smonky

回答

1

对我来说,根本不需要更多的资源(大型机器或更多机器)。如果你在谈论一天最多10万个请求服用,每次最多2秒,这意味着:每秒

  • 〜110请求。这并不是那么快。请求特别大吗?还是有大爆发?除了调度到第三方API之外,您是否正在进行繁重的处理?您目前还没有给我任何信息,导致我相信无法在单个内核上运行整个服务。 (如果你想拥有n + 2冗余,称之为最小的三台机器。)
  • 平均约有220个活动请求。再说一次,对于单个机器来说,这看起来没有问题,即使使用(每个请求的)线程模型也是如此。你为什么不扩大你的游泳池的规模,并称它为一天?这些真的很突兀吗? (您是否有严格的延迟/可靠性要求?)他们需要大量的RAM而处于活动状态吗?

你能否提供一些更多的信息,你为什么认为你必须做出这个选择?

0

与使用大量线程相比,使用node.js的事件驱动I/O可能会更好,但这可能意味着需要大量重写以及node.js相当年轻。

这个SO article可能是感兴趣的。