2015-05-13 80 views
0

林剛開始接觸的隊列,他們工作的優良消息和發送電子郵件和短信對Twilio等隊列和Webworkers與Laravel

但現在我想要做一些更復雜,耗時。我正在尋找將大約10,000行的文件上傳到AmazonS3,解析它,檢查重複項,然後只插入不重複的記錄。

當我運行此過程需要6分鐘才能完成。這是很長的路要走。我希望在後臺運行此操作,並根據隊列狀態隨時更新可視化進度條。

另外,在運行時,我希望用戶能夠完全訪問站點和數據庫表。這個過程會鎖定我的主表。 所以我基本上希望它在後臺運行,只觸摸一次主表來檢查重複項,並從那裏,只處理/解析文件到10,000 +行的臨時表中。同時讓另一張桌子免費。

一旦完成...它只會回寫一次主表。

如何在不減緩站點/主服務器速度的情況下實現這一目標?我很抱歉的極其廣泛的問題

回答

0

Laravel Queues可以做你想做的,但有幾點要解決你的電子郵件。

如何在不減緩站點/主服務器速度的情況下實現這一目標?

好,隊列運行在服務器上的一個單獨的進程,所以你可能看不到服務器上產生了重大影響,只要你的後臺程序不會做任何事情太緊張服務器。如果您擔心會影響性能,並且您正在運行Linux服務器,則可以選擇限制進程使用的資源 - 請查看renice命令,該命令允許您調整進程的優先級。如果您不在Linux上,那麼您的操作系統可能還有其他選項。

對於數據庫來說,如果不知道你的表是什麼樣的,那很難回答。可能可以在兩個表上檢查重複的單個查詢和JOIN,也許可以將檢查結果寫入不同的表。這可能工作,但它也可能需要很長時間,取決於如何設置表。另一種解決方案是使用主數據庫表的鏡像 - 暫時複製它,做你的工作,然後刪除它。最後,對於一個確實涉及的解決方案,建立數據庫複製和工作奴隸。

至於運行隊列工作者,我發現使用supervisord來運行我的後臺工作非常有幫助 - 它允許我輕鬆啓動/停止進程,並在失敗時自動重啓進程。 documentation on queue listeners對此有一些討論。

而工人將失敗 - 我發現我的工作進程經常失敗。我認爲它與PHP CLI設置有關,但它沒有引起任何問題,所以我沒有進一步調查。但是,對於長期工作,您可能會遇到困難。減輕這種影響的一種方法是將你的工作分解成多個小型工作,並將它們「菊花鏈」連接在一起:當part1完成時,它將第二部分排隊;當part2完成時,它會排隊第3部分等。

至於進度條,這很容易。讓作業用當前狀態更新一個值(可能在數據庫中,或者可能在文件系統中),並在客戶端上定期執行一個AJAX請求以獲取該值&更新進度欄。