2013-07-17 45 views
1

我們有一個高交易PHP站點,整體表現良好,但弱鏈接是慢搜索結果。原因是我們彙總了衆多來源的數據。例如:在PHP中彙總數據集以獲得最佳性能

用戶點擊搜索>從本地數據庫獲取結果1>從API 2獲取結果2>從API 3獲取結果3>從API 4獲取結果4>聚合並排序>輸出到瀏覽器。

數據來自各種來源,有些來自我們自己的PostgreSQL數據庫,但其餘來自各種外部API。

正如你所看到的,這種順序訪問是一個真正的殺手。我一直在研究使用線程的各種方法,以便我可以將每個請求分配給它自己的線程並執行最終的聚合。

到目前爲止,我傾向於專門爲搜索編寫一個基於Java的圖層。我的想法是向Java服務發送一條消息,並且它處理胎面池和聚合。我正在考慮使用node.js,但我認爲可能很難達到最終結果。

有沒有人有任何想法或建議?我願意使用任何語言或技術。

+1

不需要java:http://php.net/Thread !! –

回答

0

看起來您的請求執行時間不能小於最小API請求執行時間,即使您使所有子請求都以異步模式併發運行。如果您需要將聚合函數應用於所有API和DB數據,這是事實。但如果您不需要它,請嘗試將請求分隔成小部分。你也可以嘗試使用像Gearman這樣的任務隊列。

EDITED這裏也可以考慮任何形式的異步調用。嘗試異步調用Gearman 中的啓動任務,然後在主請求過程中從您的db中獲取數據,並開始檢查異步任務執行結果(您可以在memcache或redis中共享它)。這樣你可以並行化一部分聚合工作。

+0

感謝您的回覆。我現在會看看Gearman。 – AdamP

0

這只是一個尚未提及的替代選項。

你可以堅持純粹的PHP - 只需編寫4個新進程作爲監聽本地套接字連接的守護進程運行。您的搜索腳本可以與每個守護進程建立套接字連接並將搜索參數發送給它們,然後等待結果。您可以使用select()高效地等待套接字上的結果,但即使是在所有4個套接字上依次使用攔截fgets()調用的簡單解決方案,只要在嘗試讀取消息之前將消息發送給所有4個守護進程,就會給您帶來很好的併發性任何結果。

但是,當說,10個不同的用戶同時執行搜索時,這不會自動提供良好的併發性。守護進程可能能夠一次有效地服務多個套接字連接。對於本地數據庫查詢,您的驅動程序需要支持異步查詢。那些apis調用可能使用套接字/ http。通過使用select()或者可以考慮curl_multi,套接字/ http請求很容易並行化。

但是...使用漂亮的語言支持的線程可能會在一天結束時更簡單。

相關問題