2016-04-29 181 views
1

我需要實現一個系統,用於在服務器端運行的異步操作,並琢磨許多選項後,我不知道這將是最好的,更具可擴展性,或者說通常在這種情況下使用。由於沒有任何解決方案能夠完全解決問題,所以我一定會錯過什麼。處理異步服務器端操作

上下文:對於某些上下文,我有一個移動應用程序,用戶向其他用戶發送請求以啓動活動。這種操作是處理服務器端,如果請求不具有與其他用戶的響應,它會過期,並在15分鐘內關閉。所以,我創建與數據庫中的這個操作的開始時間的記錄,我需要更新其狀態,15分鐘後,因此異步操作。它需要恰好15分鐘才能正確通知等待的用戶。

可能的解決方案:

  • 我使用laravel,溶液我琢磨是推動延遲作業隊列。雖然一開始我認爲這將是完美的解決方案,我看也未必是可擴展的,因爲這個請求的頻率會變得過高和大量的就業機會會排隊。另外,隊列作業不能保證在達到延遲後執行,並且可能解決得太晚。

  • 另一種解決方案我想到了正在處理這一切在cron作業運行的每一分鐘,但它也有同樣的問題,當請求量高。從表現上看,每分鐘都可以做到這一點,尤其是在活動不頻繁的時候。

所以基本上,這些都是小規模經營這將是比較快的解決,但管理掛起的操作量高的成本可能比操作本身最差。是否有任何其他模式(甚至沒有減少到laravel和php)來延遲任務執行到未來的時間?

回答

1

我想你需要確定用戶請求需要由數據庫/應用程序完成的操作(即範圍爲expires列),而不是隊列守護進程。但是你希望這種決心以動態的速度發生。在Laravel

一個可能的解決方案:

創建將被添加到啓動和重新隊列本身的隊列在動態速率一元的工作。換句話說,您的隊列中只有一個作業,它會評估所有待處理的用戶請求。完成後,它將自己釋放回隊列,延遲時間取決於仍然未決的請求數(更多未決請求=更短的延遲,更少的待處理請求=更長的延遲)。用戶請求本身不會放入隊列中,只能由這個動態延遲的元作業處理。

而且,正如一個供參考的Laravel queue:work --daemon使用sleep()推遲其隊列檢查循環,這可能是比使用cron作業(或queue:listen過程),其中每一個它的調用時重新加載整個應用程序更有效率,但是必須在手動重新啓動時進行權衡,以便對您可能對應用程序所做的任何更改進行引用。

+0

您好wunch,我認爲正確的做法可能是與此類似,但有一點需要注意。它不應該在啓動時創建作業,而應該在接收到第一個請求時創建它,以便知道需要爲下一次檢查拖延多少(如果它是在啓動時創建的,但沒有任何掛起請求,我們有同樣的問題)。另外,如果達到了沒有更多請求待處理的時間點,則不應再次將其添加到隊列中,它會在接收到另一個新請求後創建。 –