2009-11-30 84 views
1

我有一個簡單的消息隊列設置並使用Zend_Queue對象啓動運行。我正在使用Zend_Queue_Adapter_Db後端。我有興趣將它用作工作隊列,以便在以後處理事件時進行處理。他們是不需要立即發生的工作,但應該儘早而不是晚些發生。用於運行Zend隊列接收器的基礎架構

是否有最佳實踐/標準方法來設置您的基礎設施以運行作業?我瞭解從隊列中接收消息的代碼,但我不清楚的是如何運行接收的程序。在命令行上接收n條消息的cron,每分鐘運行一次?一個啓動多個Web請求的cron,每個Web請求都運行接收者腳本?還有別的嗎?

切線獎勵問題。如果我使用Zend_Db運行其他查詢,那麼消息隊列查詢是否會被視爲該事務的一部分?

回答

2

你可以像線程池那樣做。創建一個命令行php腳本來處理接收。它應該由一個shell腳本啓動,該腳本在死亡時自動重啓進程。如果shell腳本已經在運行,則該腳本不應該啓動該進程(使用$ pid.running文件或類似文件)。每隔1-10分鐘就有一次cron運行。這應該很好地處理接收。

我不會讓cron觸發Web請求,除非您的cron出於某種奇怪的原因在另一臺服務器上。

另一種使用這種方式的方法是讓一些後臺進程創建數據,一個網頁用戶在瀏覽網站時自動使用它。報告生成器可能以這種方式工作。公司範圍的報告可供所有用戶使用,但您不希望他們全部生成此數據庫/時間密集型報告。因此,您可以創建一個隊列並逐個處理一個隊列,以刪除重複項。所有用戶都可以在準備好後查看報告。

According to the docs它看起來並不像zend db甚至使用與其他zend_db查詢相同的連接。但當然,找出最好的方法是做一個簡單的測試。

EDIT cron中的多行代表併發性。每條線代表池的工作人員。我不清楚,你不想讓pid作爲標識符,你想通過它作爲參數。

          • /home/byron/run_queue.sh處理1
          • /家庭/拜倫/ run_queue。SH過程2
          • /home/byron/run_queue.sh Process3

的bash腳本將檢查爲$ process.running文件,如果它發現它退出。

否則:

  • 創建$ process.running文件。
  • 啓動php進程。阻止/等待直到完成。
  • 刪除$ process.running文件。

這允許PHP腳本死亡,但不會導致池釋放工人。

如果隊列爲空,php腳本會立即退出,並由cron的nex調用再次啓動。

+0

後續問題; (道歉,如果這是天真的/明顯的)。你是否建議我 1.編寫一個PHP程序來接收消息; 2.編寫一個shell腳本,查找由PHP腳本創建的$ pid.running文件? 3.如果未找到$ pid.running文件,請啓動PHP腳本,然後退出?; 4.在crontab中有很多行用於啓動shell腳本。其中一些將運行,查看$ pid.running文件並退出,但通過每分鐘運行多次嘗試,您可以確保定期運行/重新運行該程序; 我擁有它嗎,還是我錯過了什麼? – 2009-11-30 21:59:07

+0

我也忘了,你也可以通過查看它的創建日期來設置正在運行的文件的超時時間。你需要讓你的php腳本只處理x個條目並退出,這樣你會知道最長的運行腳本會花多長時間採取。 – 2009-11-30 22:39:04

+0

啊哈,我以爲我錯過了什麼。感謝您抽出寶貴的時間在我的新手細節中解釋這一點! – 2009-12-01 02:00:04