想用gatewayworker 做物联网服务器,client_id自增会覆盖以前一直保持连接的client_id吗

themehowee

最近在测试gatewayworker,突发奇想想知道这个client_id分配的,于是找到一个文件发现如下函数:

    /**
     * 生成connection id
     * @return int
     */
    protected function generateConnectionId()
    {
        //$max_unsigned_int = 4294967295;
        $max_unsigned_int = 10;
        if (self::$_connectionIdRecorder >= $max_unsigned_int) {
            self::$_connectionIdRecorder = 1;
        }
        $id = self::$_connectionIdRecorder ++;
        return $id;
    }

我看了一个4294967295实际上就是client_id的后8为最大值ffffffff;
请问一下,系统启动的时候,如果同时有1w个设备连接到服务器,这个client_id就从1分配到了10000,假如这10000个设备只有第1个设备不掉线,一直连接服务器,后面的9999个设备都掉线了,于是不断的重连,在这样运行直到1年以后,假如第1个设备任然连接未掉线,但是现在client_id已经分配到了fffffffe,也就是只差最后一个就马上要覆盖第1个设备,为了测试上面的猜想,我将上面的4294967295改为10,第1和第2个设备不断线,一直保持连接,用第3个设备不断的连接断开,当到了9的时候下一次断开连接,发现会覆盖掉第1个设备,但是第1个设备不会掉线,也就是现在有两个1,一个2,这个2向1发送数据,发现原来一直连接的那个1不能接受信息,只能发送信息,以此类推开始时我的假想,该服务器启动以后,当客户机很多的时候,长时间运行,就会出现连接错乱的情况,请问老大这种情况应该如何避免呢?或者是可以通过怎样的方式来解决?

3156 3 0
3个回答

walkor

4294967295 个connection_id,一个进程假设每秒有10个客户端连接上来,循环一次也要13年。
一般来说一个客户端长接连了十几年已经足够用了。
如果是10个进程Gateway进程,一台服务器每秒消耗10个连接id,那么一台服务器发生connection_id被覆盖的几率要大概130年后才能发生,并且这130年有客户端从来没断开过才发生。概率极低。

当然这里也可以做个判断,判断connection_id是否在使用,如果在使用就跳过。

  • 暂无评论
小小晨曦

@walkor 2^64-1 = 9223372036854775807 用这个可以么 会有影响么?

  • 暂无评论
damao

用不了9223372036854775807,因为范围超过了unsigned int型。
看到connection_id在进程间传输都是以unsigned int传输的

  • 暂无评论
年代过于久远,无法发表回答
🔝