2008-10-24 40 views
3

我正在研究消費者的web應用程序,需要做一個長時間運行的後臺進程綁定到每個客戶的請求。長時間運行,我的意思是在1到3分鐘之間。尋找模式/方法/建議來處理長時間運行的操作綁定到web應用程序

下面是一個示例流程。對象/小部件並不重要。

  1. 客戶來到網站並指定他們正在尋找的物件/小工具。
  2. 我們搜索/清除/過濾符合某些初始條件的小部件。 < - 長時間運行過程
  3. 客戶進一步配置他們正在尋找的小部件的更多細節。
  4. 長時間運行過程完成後,客戶可以在轉換前完成最後幾個步驟。

步驟3和步驟4並不重要。我只是提到他們,因爲我們可以在長時間運行的過程中購買一些時間。

我們正在使用的環境是LAMP堆棧 - 目前使用PHP。它似乎不是一個好的設計,讓長時間運行的進程在mod_php(或fastcgi進程)中佔用apache線程。我們的應用的apache層應該專注於提供內容而不是數據處理IMO。

幾個問題:

  1. 是我們在思考的權利,我們應該走出阿帕奇/ web應用程序層的這種「長時間運行」的部分分開?
  2. 有沒有一個標準/典型在Linux/Apache/MySQL/PHP(我們可以使用不同的語言進行處理,如果合適的話)打破這種方式?
  3. 有關如何解決問題的建議?例如。我們是否創建了一個通過FIFO隊列攪動的deamon?

編輯:爲了澄清,只有大約四分之一的長期運行過程是以數據庫爲中心的。我們正在努力優化該部分。我們可能會做一些工作,但我們現在的工作量有限。

謝謝!

回答

0

這是窮人的解決方案:

exec ("/usr/bin/php long_running_process.php > /dev/null &"); 

另外,您可以:

  1. 插入一行到你的數據庫的背景要求的細節,其中一個守護進程就可以讀取和處理。

  2. 將消息寫入消息隊列,然後守護程序會讀取並處理消息。

1

考慮通過AJAX從Web服務而不是您的應用程序提供搜索結果。大概你可以把它卸載到另一臺服務器上,讓你的web應用程序處理你想要的內容。

只是好奇:1-3分鐘似乎很長一段時間的查詢查詢。您是否查看了要查詢的列上的索引以提高速度?或者你需要做一些算法過程 - 也許你可以執行一些這種離線,並預先提示一些常見的搜索提示?

+0

您好,我們曾做過多次越過模式的結果某處記錄,以確保它是索引正確。我們的侷限性在於,我們無法進行許多離線處理(數據使用協議的B/c)。 – drsnyder 2008-10-27 18:31:54

-1

不是一個完整的答案,但我會認爲使用AJAX並將第二步傳遞給PHP(C,C++,C#)更快的事情,然後PHP函數將某些堆棧的結果從數據庫中挑選出來。

0

下面是關於此問題的Java版本的一些討論。

見你可能會做java: what are the best techniques for communicating with a batch server

兩個重要的事情:

  1. 切換到Java和使用JMS。

  2. 閱讀JMS,但使用另一個隊列管理器。例如,Unix命名管道可能是一個可接受的實現。

+0

Apache ActiveMQ支持各種語言和協議,包括通過Stomp的PHP:http://stomp.codehaus.org/PHP+Connectivity。 – 2008-12-05 03:19:54

0

Java servlets可以做background processing。在具有線程支持的Web技術中,您可以使用與此技術類似的東西。雖然我不知道PHP。

1

正如Jonnii建議的那樣,您可以啓動子進程來執行後臺處理。然而,這需要一些小心地進行:

  • 確保通過傳遞的所有參數都逃脫正確
  • 確保過程的多個副本不會同時運行

如果有多個進程拷貝運行,沒有什麼能夠阻止(甚至是惡意的,只是不耐煩的)用戶在頁面上重新加載,最終啓動很多副本,以至於機器用完ram並停下來。

所以你可以使用一個子過程,但要小心,以受控的方式進行測試。

另一種選擇是有一個守護進程永久性運行等待請求,處理它們,然後(也許在數據庫中)

相關問題