2011-10-27 33 views
0

有一個beanstalkd隊列,每隔10分鐘就會有很多任務被填充,並且每個任務都是儘快處理的重中之重。任務可能需要幾毫秒才能完成,因爲有第三方服務的調用,這些服務往往會暫時超時。使用PHP-FPM管理隊列使用者可以嗎?

因此,由於PHP沒有多線程,一種選擇是創建大量閒置的工作人員,這將嘗試預留任務,但可能需要太多的RAM,這些可能無法用於這些任務框。

使用PHP-FPM調整工人數量並節省一些RAM是否是一個好主意?生產就緒嗎?有更好的解決方案嗎?

感謝

回答

1

我正在運行一個每天處理數百萬條消息的隊列系統。大多數情況下都是通過Amazon SQS,但我現在還在運行一個新的Beanstalkd系統,其中有超過600,000個信息。

a blogpost on the subject描述,我有一個循環處理消息運行外殼腳本(PHP腳本內的循環返回之前運行多個作業也有些有用,至少對於較小的作業)。

這些shell腳本以Supervisord開頭。還有另一個blog post on the use of that。目前,我正在九臺機器上運行超過800個工作腳本(用於幾種不同類型的作業),所有這些腳本都從各種隊列中拉出,並將數據放回其他隊列,寫入數據庫或文件。增加每臺機器的工人數量是增加「工作量」(或者已經足夠大),然後根據需要開始更多的事情。你也可以說5自動啓動,然後另一個50塊,可以根據需要啓動。

我發現每個工人只需要大約20mb的非共享內存(其餘的進程之間是共同的)。這當然取決於工人的任務。調整圖像大小可能需要很多努力。部分原因是由於這個原因,我已經設置好能夠頻繁地重新啓動PHP腳本。

1

每當我不得不同時(或異步)運行的東西,我派出作業gearman工人。我通常每個物理機器運行每個CPU核心至少有一個進程。

PHP-FPM是一個cgi守護進程。所以你基本上會讓你的beanstalkd處理器向你自己的系統運行一堆HTTP請求。那些可能需要通過你的http堆棧。不知道這是否是一個好主意。

您也可以檢查出pcntl_fork將當前進程分成多個正在運行的進程。

+0

感謝您的建議,我會看看齒輪工。有一個FPM的PHP客戶端,它允許繞過HTTP堆棧,所以這有點更好,但還不完美。分叉基本上會消耗相同的內存,就像運行不同的進程一樣,對吧? – Fluffy

+0

是的叉子消耗自己的記憶。但它們只在需要時創建並在之後刪除。使用PHP-FPM,您總是會保存一堆緩存的進程(這使得總體感覺...)。嗯,我不知道任何FPM客戶端,哪裏可以找到? – rodneyrehm

+0

我的意思是:https://github.com/adoy/PHP-FastCGI-Client – Fluffy

相關問題