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

服務(wù)器向設(shè)備發(fā)送心跳檢測(cè),好像未關(guān)閉通道

問(wèn)題描述

目前在做設(shè)備物聯(lián)網(wǎng),分成了客戶端client_gateway和設(shè)備端device_gateway,因?yàn)樵O(shè)備電池比較小,硬件大佬要做低功耗,就說(shuō)服老板取消了定時(shí)發(fā)送心跳,搞的現(xiàn)在設(shè)備在線狀態(tài)都不準(zhǔn)確了。

今天想起可以反向發(fā)送心跳檢測(cè),就試了下,確實(shí)發(fā)出去了,但是也出現(xiàn)了新問(wèn)題:
設(shè)備不再發(fā)送心跳,為了省電(我也不知道究竟能省多少電...)
客戶端(小程序)模式不變定時(shí)發(fā)送心跳給服務(wù)器
device_gateway增加了服務(wù)端發(fā)送心跳

        // 服務(wù)端定時(shí)向客戶端(設(shè)備)發(fā)送的數(shù)據(jù)(在設(shè)備不發(fā)心跳的情況下)
        if (empty($GatewayDevicePingCloseLimit)) {
            $gateway->pingData = 'ping';
            $gateway->pingInterval = 20;
        }

經(jīng)過(guò)測(cè)試設(shè)備可以收到ping,但是當(dāng)我把設(shè)備斷電后等了好久,似乎并沒(méi)有執(zhí)行關(guān)閉通道操作

    /**
     * 當(dāng)斷開(kāi)連接時(shí)觸發(fā)
     * @param int $connect_id 連接id
     */
    public static function onClose($connect_id)
    {
        $target = 'client';

        //設(shè)備下線
        if (isset($_SESSION['device_info'])) {
            $target = 'device';

            //出現(xiàn) not_log 時(shí)不進(jìn)行下線處理,一般用于重復(fù)連接時(shí)關(guān)閉舊連接的情況
            if (!isset($_SESSION['not_log'])) {
                $device_info = $_SESSION['device_info'];
                //生成設(shè)備下線日志,同時(shí)改變?cè)O(shè)備狀態(tài)
                self::$service->create_device_log($device_info['device_id'], 4, '設(shè)備下線了');

                //發(fā)送給客戶端(用戶)
                self::send_client_message_by_user_id($device_info['user_id'], 'device_online_state', 0, $device_info);
            } else {
                unset($_SESSION['not_log']);
            }

            unset($_SESSION['device_info']);
        }
        //這里只是打印消息日志
        self::print_client_message($connect_id, 'onClose', $target, 'down');
    }

加個(gè)not_log標(biāo)識(shí)是為了解決踢掉舊鏈接時(shí)把狀態(tài)改為離線的bug
求大佬看看哪里的問(wèn)題

956 1 1
1個(gè)回答

latin

TCP機(jī)制就是這樣,斷電這種無(wú)法及時(shí)檢測(cè)到,要等數(shù)據(jù)包不斷重傳超時(shí)后才能發(fā)現(xiàn)連接斷開(kāi),這個(gè)時(shí)間很久。
修改linux內(nèi)核,開(kāi)啟keepalive,修改keepalive時(shí)間和間隔好像可以緩解這種情況

  • 追夢(mèng)隨想 2023-12-11

    可是官方文檔是這么說(shuō)的由于心跳是周期性檢測(cè),實(shí)際執(zhí)行onClose的時(shí)間一般會(huì)大于pingInterval*pingNotResponseLimit=55,誤差在pingInterval內(nèi)。 http://www.wtbis.cn/doc/gateway-worker/heartbeat.html

  • latin 2023-12-11

    官方說(shuō)的沒(méi)問(wèn)題啊,官方說(shuō)的這個(gè)前提是客戶端有發(fā)心跳或響應(yīng)心跳,并且服務(wù)端設(shè)置了pingNotResponseLimit。你的客戶端不發(fā)心跳,也不響應(yīng)心跳,也沒(méi)辦法設(shè)置pingNotResponseLimit,根本不符合這塊文檔的條件

  • 追夢(mèng)隨想 2023-12-11

    那不是沒(méi)法解決了,哎,愁死了,感謝大佬耐心解答

  • rbb 2023-12-11

    這個(gè)斷電問(wèn)題,你看下能不能在服務(wù)端加個(gè)定時(shí)器,隔一段時(shí)間掃描一下在線設(shè)備。

  • 追夢(mèng)隨想 2023-12-12

    定時(shí)全部掃描一遍?還是每個(gè)連接單獨(dú)一個(gè)定時(shí)器,這樣確實(shí)能解決,我也想過(guò),就是怕影響穩(wěn)定性

  • rbb 2023-12-12

    就寫在一個(gè)進(jìn)程就好了。

  • 追夢(mèng)隨想 2023-12-12

    那應(yīng)該如何判斷設(shè)備是否在線呢?沒(méi)有執(zhí)行關(guān)閉 connect_id 就一直存在,沒(méi)辦法判斷啊,難道判斷最后一次發(fā)送數(shù)據(jù)的時(shí)間么

  • rbb 2023-12-12

    在登錄的時(shí)候還是要入一下庫(kù),例如redis集合吧。然后掃描在線列表(掃到心跳T掉客戶端的時(shí)候)求差集,就是你想要得異常下線的吧?

  • rbb 2023-12-12

    或者在客戶端ping的時(shí)候,用session記錄ping的時(shí)間,然后下次掃的時(shí)候,用和服務(wù)器心跳一樣的算法判斷他是否掉線。

  • 追夢(mèng)隨想 2023-12-12

    設(shè)備取消心跳了,只能記錄最后一次上報(bào)數(shù)據(jù)的時(shí)間,然后定時(shí)做超時(shí)對(duì)比了,只是時(shí)間太短還不如用心跳,時(shí)間太長(zhǎng)狀態(tài)也不準(zhǔn)確,硬件大佬真是坑爹啊

  • rbb 2023-12-12

    極端情況只能這樣了,百分之98的場(chǎng)景能通就行呀

  • q736979353 2024-03-18

    最后怎么解決的呀

  • JackDx 2024-03-18

    定時(shí)器上報(bào)吧 未上報(bào)的就異常

年代過(guò)于久遠(yuǎn),無(wú)法發(fā)表回答
??