国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

Worker 不間斷執(zhí)行任務(wù)最佳實(shí)踐

aidong_wang

項(xiàng)目整體是一個(gè) Gateway 網(wǎng)關(guān),保持跟物聯(lián)網(wǎng)設(shè)備雙向通訊?,F(xiàn)在因?yàn)闃I(yè)務(wù)需要,我們啟動(dòng)了 10 個(gè) Worker 不間斷的從騰訊云的消息隊(duì)列獲取消息,并且轉(zhuǎn)發(fā)給對(duì)應(yīng)的物聯(lián)網(wǎng)設(shè)備。先上代碼:

[attach]2022[/attach]
?

如截圖所示,當(dāng) onWorkerStart 之后,通過(guò) while(true) 不間斷從騰訊云消費(fèi)消息,針對(duì)此實(shí)現(xiàn)方案,想請(qǐng)教大家兩個(gè)問(wèn)題:
?
1、Gateway 中 除了使用 worker 做這種任務(wù)外,是否還有其他的更優(yōu)方案
2、onWorkerStart 的回調(diào)函數(shù)中,使用 while(true) 有什么風(fēng)險(xiǎn)?是否有更好的建議?
3、這個(gè) 10 個(gè) worker 的生命周期如何管理?如何實(shí)現(xiàn) worker 卡死或者掛掉后能自動(dòng)重新啟動(dòng)?
?

5226 4 0
4個(gè)回答

walkor 打賞

1、這種情況使用單獨(dú)的worker基本是最優(yōu)的方案
?
2、while(true) 會(huì)讓進(jìn)程一直運(yùn)行在while(true) 的循環(huán)中,進(jìn)程無(wú)法處理其它業(yè)務(wù)邏輯,比如無(wú)法處理onMessage onClose等,無(wú)法響應(yīng)php start.php status命令(對(duì)應(yīng)進(jìn)程顯示busy狀態(tài)),無(wú)法響應(yīng)stop命令,stop后會(huì)有退出碼為9的日志。如果確定只需要運(yùn)行while(true) 里面的代碼即可,則除了上面列出的影響外其它沒(méi)有影響,問(wèn)題不大
?
3、 worker退出后會(huì)自動(dòng)重啟。但是worker卡死看是怎樣算卡死,比如CmqApi::receiveMsg()本身就是阻塞的,無(wú)超時(shí)時(shí)間,如果隊(duì)列里1天的沒(méi)有消息發(fā)過(guò)來(lái),進(jìn)程就一直阻塞在這里不動(dòng),那么怎么判定是卡死還是沒(méi)有消息?
?
檢測(cè)業(yè)務(wù)進(jìn)程是否卡死可以采用類(lèi)似心跳的方式,比如每個(gè)進(jìn)程在一定時(shí)間間隔內(nèi)向磁盤(pán)更新自己的一個(gè)時(shí)間戳文件(內(nèi)容就是當(dāng)前時(shí)間戳),這樣可以通過(guò)單獨(dú)開(kāi)啟一個(gè)worker進(jìn)程定時(shí)檢查時(shí)間戳文件里的時(shí)間是否及時(shí)更新來(lái)判定進(jìn)程是否有卡死。如果卡死通過(guò)發(fā)送SIGKILL信號(hào)posix_kill(pid, SIGKILL)將對(duì)應(yīng)進(jìn)程殺死重啟即可。
?
如果CmqApi::receiveMsg()是阻塞的,但是有超時(shí)時(shí)間,比如即使沒(méi)有消息CmqApi::receiveMsg()會(huì)在1分鐘后返回null,那么就可以CmqApi::receiveMsg()下面寫(xiě)一個(gè)時(shí)間戳日志。啟動(dòng)一個(gè)worker進(jìn)程每2分鐘檢查一次,如果對(duì)應(yīng)進(jìn)程在x分鐘內(nèi)沒(méi)有更新時(shí)間戳就認(rèn)為進(jìn)程卡死了。 如果CmqApi::receiveMsg()是無(wú)限阻塞的沒(méi)有超時(shí)時(shí)間就沒(méi)有辦法判斷是真的卡死還是消息隊(duì)列沒(méi)有消息了。

  • aidong_wang 2019-05-14

    非常感謝您的回復(fù)
    CmqApi::receiveMsg()是阻塞的,但是有超時(shí)時(shí)間,我們將采用您建議的方案:
    “檢測(cè)業(yè)務(wù)進(jìn)程是否卡死可以采用類(lèi)似心跳的方式,比如每個(gè)進(jìn)程在一定時(shí)間間隔內(nèi)向磁盤(pán)更新自己的一個(gè)時(shí)間戳文件(內(nèi)容就是當(dāng)前時(shí)間戳),這樣可以通過(guò)單獨(dú)開(kāi)啟一個(gè)worker進(jìn)程定時(shí)檢查時(shí)間戳文件里的時(shí)間是否及時(shí)更新來(lái)判定進(jìn)程是否有卡死。如果卡死通過(guò)發(fā)送SIGKILL信號(hào)posix_kill(pid, SIGKILL)將對(duì)應(yīng)進(jìn)程殺死重啟即可”

    如果我們的 Worker 希望能響應(yīng)php start.php status命令,Worker 需要做哪些操作才能支持?

aidong_wang

@https://wenda.workerman.net/people/walkor?
我記得哪里有提到可以相應(yīng) status 命令的方法,可以再發(fā)一下嗎?

  • 暫無(wú)評(píng)論
walkor 打賞

while 循環(huán)改成定時(shí)器。但是你的情況不一定有效,因?yàn)檫M(jìn)程可能長(zhǎng)時(shí)間阻塞在CmqApi::receiveMsg(),無(wú)法在1秒內(nèi)響應(yīng)status命令

  • aidong_wang 2019-05-16

    是的,改成定時(shí)器會(huì)降低性能,CmqApi::receiveMsg() 函數(shù),發(fā)送請(qǐng)求達(dá)到騰訊云如果沒(méi)有消息,會(huì)被 hold 一定時(shí)間才返回。

    如果沒(méi)有其他實(shí)現(xiàn)方案,那感謝您的支持和解答了

wadeYang

截圖
請(qǐng)教大佬,你這個(gè)不加usleep(n)或者sleep()函數(shù),CPU不會(huì)爆滿(mǎn)嗎?
我之前做一個(gè)類(lèi)似demo,不加的話(huà)CPU一直100%。
我在我標(biāo)記那里(兩個(gè)地方任意一個(gè)地方都可以,目的就是想干完一段活兒后稍微休息下)加上sleep或者usleep,不想延遲太多就usleep(單位微妙),世界瞬間平靜了,CPU降下來(lái)了。

我也不懂是為什么,在此也想請(qǐng)教各位大佬,是所謂的暫時(shí)讓出cpu的意思嗎

  • 暫無(wú)評(píng)論
年代過(guò)于久遠(yuǎn),無(wú)法發(fā)表回答
??