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

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

aidong_wang

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

[attach]2022[/attach]
?

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

5231 4 0
4個回答

walkor 打賞

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

  • aidong_wang 2019-05-14

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

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

aidong_wang

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

  • 暫無評論
walkor 打賞

while 循環(huán)改成定時器。但是你的情況不一定有效,因為進程可能長時間阻塞在CmqApi::receiveMsg(),無法在1秒內(nèi)響應status命令

  • aidong_wang 2019-05-16

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

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

wadeYang

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

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

  • 暫無評論
年代過于久遠,無法發(fā)表回答
??