是這樣的,本身需求有短連接和長鏈接
雖然webman可以自定義websocket,但是改了代碼就會reload,或者業(yè)務(wù)頻繁變動都會導(dǎo)致鏈接斷開,所以針對長鏈接還是想用gatewaywork
如果這樣配合的話,業(yè)務(wù)也不想寫在gatewaywork,準(zhǔn)備gateway只做網(wǎng)關(guān)用,在gateway的worker只處理一下最初的鑒權(quán),然后綁定分組
消息的發(fā)送全部由webman使用gatewayclient來進(jìn)行發(fā)送,可能的流程會是這樣
用戶點了某個按鈕,發(fā)齊http到webman,webman業(yè)務(wù)代碼
第一種:里根據(jù)邏輯發(fā)送了一個延時隊列,然后webman http response用戶信息,過了一會,隊列執(zhí)行了,然后隊列里面通過gatewayclient給用戶發(fā)送了一個消息,用戶監(jiān)聽的websocket又收到了一條長鏈接信息
第二種:在業(yè)務(wù)代碼直接調(diào)用gatewayclient給另一個用戶發(fā)了一條推送消息,然后用戶收到了自己的webman response
就是這種使用方式,會不會有什么坑
另外確認(rèn)下 不管是 隊列還是自定義進(jìn)程,還是業(yè)務(wù)進(jìn)程 reload都是安全的吧,都是執(zhí)行完當(dāng)前請求,退出,而不是立刻結(jié)束掉自己對吧,就是reload對代碼執(zhí)行是安全的
另外再補充一個忘了的比較重要的事,使用-d 守護(hù)進(jìn)程后,如果進(jìn)程因為什么原因崩掉了一般建議使用什么服務(wù)防止這個問題呢,推薦的額外的守護(hù)進(jìn)程使用什么合適
還要補充一個疑問
workerman/crontab 這個組件我看默認(rèn)啟動是一個進(jìn)程,啟動兩個進(jìn)程會導(dǎo)致任務(wù)執(zhí)行兩次,請問這個是只能啟動一個嗎,這樣的話會不會任務(wù)多了遇到性能問題,有什么方案嗎
-
第二種:在業(yè)務(wù)代碼直接調(diào)用gatewayclient給另一個用戶發(fā)了一條推送消息,然后用戶收到了自己的webman response
感覺這種方式更好一些。
另外確認(rèn)下 不管是 隊列還是自定義進(jìn)程,還是業(yè)務(wù)進(jìn)程 reload都是安全的吧,都是執(zhí)行完當(dāng)前請求,退出
大部分情況下是安全的。不過如果業(yè)務(wù)在2秒內(nèi)沒完成,進(jìn)程會被強行殺死,這個時候是不安全的。
另外再補充一個忘了的比較重要的事,使用-d 守護(hù)進(jìn)程后,如果進(jìn)程因為什么原因崩掉了一般建議使用什么服務(wù)防止這個問題呢,推薦的額外的守護(hù)進(jìn)程使用什么合適
workerman 主進(jìn)程不處理任何業(yè)務(wù),很穩(wěn)定,所以不用擔(dān)心主進(jìn)程崩掉的情況。
workerman/crontab 這個組件我看默認(rèn)啟動是一個進(jìn)程,啟動兩個進(jìn)程會導(dǎo)致任務(wù)執(zhí)行兩次,請問這個是只能啟動一個嗎,這樣的話會不會任務(wù)多了遇到性能問題,有什么方案嗎
workerman/crontab 無法智能理解你任務(wù)的內(nèi)容,無法根據(jù)你的業(yè)務(wù)自動做排重。多進(jìn)程的時候需要自己寫業(yè)務(wù)做排重。不同的任務(wù)排重方案可能不同,例如發(fā)郵件,你可以按照 用戶uid % 進(jìn)程數(shù)==$worker->id
來分散任務(wù)排重。
關(guān)于性能問題,一般定時任務(wù)處理的業(yè)務(wù)量都不大,大部分情況不需要考慮性能。如果你要極致性能,也可以考慮弄個隊列(比如workerman/redis-queue),定時任務(wù)將大任務(wù)分散成多個小任務(wù)投遞到隊列,多個消費者一起消費。
恩恩,crontab確實可以只作為一個定時任務(wù)分發(fā),具體執(zhí)行任務(wù)重的話可以走隊列;
另外我的第一種、第二種不是說那種更好,是兩種使用情況,就和上面的crontab一樣,有些業(yè)務(wù)操作很復(fù)雜,可能利用會立刻受到webman的response(http 一問一答么),然后具體的任務(wù)交給隊列處理,隊列再通過gatewayclient 發(fā)消息給用戶,一種就是任務(wù)簡單了直接發(fā)了,我描述的1、2其實說的是我這樣使用 gateway的網(wǎng)關(guān)那套框架 只用于給用戶發(fā)推送,具體業(yè)務(wù)不寫在gateway里,全都都通過webman調(diào)用gatewayclient推合適不合適,這樣用不算是瞎折騰吧,因為想著還是http寫業(yè)務(wù)簡單點(當(dāng)然其實之前單純用gateway已經(jīng)寫過兩個業(yè)務(wù)了很穩(wěn)定);所以說了一下1、2兩種使用情況,確認(rèn)下可行不
雖然webman能自定義進(jìn)行,直接做長連接服務(wù),但是不是 reload會都導(dǎo)致重連么,而且之前用gateway感覺網(wǎng)關(guān)層挺穩(wěn)定的,而且gatewayclient這個客戶端拿來通過http推消息還挺方便的,所以才有此一問,