在工作人員使用任何類型的工作隊列時,這通常是一個被忽視的問題。 100名工作人員將分別打開一個單獨的數據庫連接(它們是獨立的PHP進程)。如果MySQL配置了50個連接,工作人員將開始失敗。要回答你的問題:
1)每個worker每個在一個PHP進程內部運行,並且該進程將打開1個數據庫連接。工作人員不共享數據庫連接。
2)如果只有一個工作人員正在處理作業,則只會打開一個數據庫連接。如果您有50名員工正在運行,則需要50個數據庫連接。由於這些不是網絡請求,持續連接將不起作用,共享將無法工作。
3)您可以通過添加READ從站來平衡負載,並使用MySQL代理來分配負載。
4)我從來沒有見過即付即用MySQL託管解決方案。要求您的提供商增加您的連接數量。如果他們不願意,可能是時候運行你自己的服務器了。
此外,守隊員服務器進程本身將只使用一個數據庫連接來維護隊列(如果您已啓用mysql存儲)。
策略可以用來與數據庫很好的嘗試,並讓你的員工代碼玩法:
每次作業後,終止工作,並再次啓動。在收到新作業之前,不要打開新的數據庫連接。使用supervisor可讓您的員工始終保持正常運轉。
每次查詢後關閉數據庫連接。如果您看到大量連接在「睡眠」狀態下打開,這將有助於清理並保持較低的數據庫連接。每次查詢後嘗試$pdo = null;
(如果使用PDO)。
緩存頻繁使用的查詢,其結果不會改變,以保持數據庫連接低。
確保您的表格已正確編制索引,以便查詢以儘可能快的速度運行。
確保在try/catch塊中捕獲數據庫異常。添加重試邏輯(while循環),其中工作人員在說出10次嘗試後將優雅地失敗。確保失敗後將作業放回隊列。
我不知道您的應用程序運行的確切程度。 Gearman本身只使用持續隊列來寫入隊列並在重新啓動後從中讀取。所以Gearman只使用一個連接。我相信你的工作每次都會啓動一個新的mysql連接,因爲你的工作,齒輪工人無法幫到你。你必須在你的工人代碼中修復它。 http://php.net/manual/en/features.persistent-connections.php可能可以幫助這裏。 3)多數民衆贊成什麼齒輪的人?只有一個服務器和來自任何地方的多個客戶... gearman會處理它.. 4) - 抱歉,不知道:( –
@ dominik.mank 3)我想運行在多臺服務器上的工作人員,而不是一臺服務器。這可能使用Gearman? –
請查看經銷商http://gearman.org上的圖片http://gearman.org/img/cluster.png。是的,它可能,但不是我不能說你的應用程序如何完成它,因爲它取決於你如何使用gearman。 –