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