2011-11-07 88 views
1

我正在致力於圖像託管網站(圖庫的競爭對手),並需要加強我的遊戲。新照片通過FTP上傳或放置在服務器上,並進行索引(快速),然後稍後縮略圖(緩慢)。PHP/MySQL中的異步消息傳遞?

  1. 最簡單的實現是允許用戶上傳,然後索引和縮略圖,而他們等待(緩慢的網頁加載)。管理員可以登錄索引,然後縮略圖手動上傳的其他文件(緩慢頁面加載,刷新並可能需要幾小時)。

  2. 我現在的實現是用戶上傳原因索引,而他們等待,有時(隨機)整個網站索引在正常頁面負載之上搭載(對用戶造成額外的邊緣延遲)。網站上的網頁指的是縮略圖應該存在的網址。如果用戶請求不存在的縮略圖,則在等待時創建它(「懶惰縮略圖」)。

2的好處是在多核系統上使用所有內核。缺點是,第一次需要一頁新照片加載30x50 MB,並且頁面超時,其中一些圖像完成,其他圖像處理最後的加載。

問題是在這裏實現任務處理的正確方法是什麼?如果它擴展到共享數據庫上的多個服務器,則爲獎勵點。

一個想法如下(可能是亂碼)

我想過做一個數據庫中的作業表:

id INT NOT NULL AUTO_INCREMENT, 
priority INT NOT NULL, 
worker INT, 
workstarted DATETIME, 
func CHAR(10) NOT NULL, 
args VARCHAR NOT NULL, 
PRIMARY KEY(id), 
INDEX(priority), 
UNIQUE(func,args) -- prevent duplicate jobs if user does F5 

然後當工作需要完成,插入一行,並創建一個工作者線程(如果足夠的線程不存在)。然後等待響應,並在作業成功完成或5秒後超時後繼續。如果發生超時,請使用AJAX將內容提供給用戶。

事情我不知道該怎麼做這種方法是:如果足夠的工作線程存在(使用表和心臟跳動?),工作人員如何發送響應(完成時刪除作業和如果失敗,寫另一個表?),請求者如何高效地等待響應或超時(比輪詢數據庫更好?)。根據這些方法,系統可以隨着在不同服務器上運行的員工進行擴展。

回答

2

我建議使用ZeroMQ來解決您的問題。

這是一個帶多種語言(包括PHP)綁定的套接字框架。您可以在不使用數據庫的情況下開發一個工作者系統,並且可以跨多個節點(執行工作的物理機器)擴展工作。

Here's an introduction to the 0MQ

Here's the documentation with PHP examples

Here's the 0MQ guide at github

主觀意見:它只是搖滾使用0MQ。它速度非常快,有很多例子,並附有優秀的指南。

+0

這看起來像是要走的路。這是一個成熟的項目,所以我需要檢查和評估0MQ的成熟程度,並確保它不會很快被取代。謝謝! –

+0

祝您的項目順利! :) –