2011-09-12 20 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可能是感興趣的。