2012-07-11 49 views
1

我有一個服務,我需要每一個用戶請求要求40的外部服務(API的),以得到他們的信息。例如,一個用戶正在搜索一些信息,我的服務是要求40個外部合作伙伴獲取信息,並將其彙總到一個數據庫(mysql)中,並將結果顯示給用戶。規模多要求不同的服務

在這一刻我有一個multicurl解決方案,我一次有10個合作伙伴請求,如果有人完成了請求,那麼軟件會從剩下的30個添加另一個夥伴到multicurl隊列,直到所有40個請求都完成,結果在數據庫中。

對這個解決方案的問題是,它無法擴展在多臺服務器,我想有一些解決方案,在那裏我可以在同一時間如火災40分要求2-3服務器和只等待這麼久,作爲最慢的合作伙伴提供結果;-)這意味着,如果最慢的合作伙伴花費10秒鐘,我將在10秒內獲得所有40個合作伙伴的結果。在multicurl我遇到麻煩,一次有多個10-12個請求。

什麼樣的解決方案,可以爲您提供我,我得到儘可能低ressources,可以在一臺服務器上運行許多許多工藝和可擴展性。我的軟件是用PHP編寫的,這意味着我需要通過框架或API很好地連接到解決方案。

我希望你能理解我的問題和需求。請問,如果有什麼不明確的。

+0

你可以寫上這款本本,其廣泛用於S.O – 2012-07-11 21:34:54

+0

嘛不唯書,但我知道它的複雜:-)也許有一些提示這一點,我怎麼可以擴展它在多臺服務器? – 2012-07-11 21:50:50

+0

爲什麼一次只能使用多次捲曲來限制10-12個請求?我在一臺低端機上一次完成了200個請求。除非服務器上存在限制,否則您應該可以在沒有問題的情況下執行40次。 – 2012-07-12 01:20:41

回答

1

一種可能的解決辦法是使用一個message queue系統等beanstalkdApache ActiveMQmemcacheQ

高水平的例子是:

  • 用戶做出請求到服務以供信息
  • 您的服務將請求添加到隊列中(假設您希望針對每個服務查詢一個服務)
  • 一個或多個作業服務器連續輪詢工作
  • 作業服務器從隊列中得到的消息做一些工作隊列中,添加數據到數據庫,並從隊列中刪除的項目。

在這個模型中,由於現在執行40個請求的一個任務是分佈式的,不再是一個「過程」的一部分,下一部分將解決如何將一組工作標記爲完成。這部分可能並不那麼困難,或者它可能會引入新的挑戰(取決於數據和應用程序)。也許你可以使用另一個緩存/數據庫行來設置一個計數器,以滿足特定請求需要完成的作業數量,並且當每個隊列工作者完成請求時,它可以將計數器減1。一旦計數器爲0,知道請求已完成。但是當你這樣做時,你需要確保計數器達到0並且不會因爲某種原因卡住。

這是至少有一種方式,希望幫助你一點或打開更多的想法了門。

+0

那麼我在這個系統模型中看到的問題是,隊列有時可能已滿,並且沒有過程完成,因爲工作人員都將在同一時間工作。爲了防止這種情況的發生,我需要有許多工人開始聆聽......這樣就失去了很多資源,即使沒有太多的要求給所有的工人。 – 2012-07-12 10:21:43

+0

我不認爲這是一個問題。您可以讓工人從隊列中抓取10個物品並立即處理它們,或者讓許多工人一次處理一項工作。您可以通過每15秒運行一次cron作業來啓動這些工作,或者讓每臺服務器上的許多工作人員在一個循環中運行,以查找新工作,然後在隊列中沒有任何內容的情況下休眠一小會兒。隊列無法真正填滿,其大小几乎沒有限制(基於磁盤存儲)。添加到隊列中的第一個項目也是第一批要處理的項目。你只需要確保你能跟上。 – drew010 2012-07-12 16:48:11