由于郵件發(fā)送比較耗時,所以我用AsyncTcpConnection異步任務,但由于workerman是多進程單線程,那么在如下場景中,該如何提高并發(fā)效率呢?
場景:
有2個耗時任務需要在同一時間執(zhí)行,其中一個是郵件群發(fā),假設要發(fā)送1000個郵件,任務進程100個。
方案疑問:
1、1000個郵件分別通過AsyncTcpConnection發(fā)送給100個進程。這種方案會因為100個進程被占滿,而導致另一個任務必須等待1000個郵件全部發(fā)送完畢后才能執(zhí)行。
2、1000個郵件只發(fā)送給1個進程,這樣雖然2個任務都能同時執(zhí)行,但其余的98個進程處于閑置狀態(tài),而1000個郵件只能在單線程中耗時很久。
3、根據(jù)任務中的子任務數(shù)量均分進程,比如讓1000個郵件占用80個進程,另一個任務占用20個進程。但是任務有很多種類,都是后臺人工添加的,所以php無法知道某個任務是不是非常耗時,而無法正確分配進程。
4、采用php多線程,但workerman手冊說pthreads擴展還不夠穩(wěn)定,所以不知道php多線程是否靠譜。
所以上述我能想到的4種方案,都存在問題,那么,還有什么方案能保證我這個需求呢?跪求?。?/p>
1、首先按照手冊的異步方案來實施:
http://doc.workerman.net/faq/async-task.html
假定兩個耗時任務分別為A和B、那么對于單臺任務服務器可以開啟兩組不同的端口,即分別對應AB開啟兩種不同的業(yè)務進程組分別處理;另外任務服務器的強處理能力需要保證:比如多核保證充分發(fā)揮多進程優(yōu)勢、另外就是足夠大的內存、這個需要自己根據(jù)業(yè)務評估;再有就是集群了,把不同的任務交給不同的機器來處理。
2、1000個郵件只發(fā)送給1個進程,這樣雖然2個任務都能同時執(zhí)行
,這個說法不對,單進程內是不可能并行執(zhí)行的,是串行運作的;
3、比如:寫入任務的時候給任務打個tag或優(yōu)先級啥的,這樣根據(jù)不同的tag交給不同的進程組或機器來處理;
4、PHP的多線程擴展不穩(wěn)定,所以不推薦使用;
謝謝,我也想過使用不同端口運行不同任務,但是由于任務的數(shù)量是不確定的,就需要動態(tài)開啟新端口。但workerman啟動多少個進程,只能在linux里部署時或者平滑重啟才能生效,無法通過php端的代碼動態(tài)新增端口。
我認為技術架構的變遷是一定是跟隨著業(yè)務聯(lián)動變遷的;任務數(shù)在特定的一段周期內肯定是能有個預估值的;長遠的看即便任務數(shù)量不確定,也沒什么關系呢,還是那句話,有量就同步的橫向擴展多進程模型甚至集群部署;另外新增動態(tài)端口可以通過新增獨立的啟動腳本實現(xiàn),不一定非得是在原啟動腳本下派生子進程;
關于如何平滑新增服務,看這里: https://github.com/walkor/Workerman/pull/503