最近在测试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不能接受信息,只能发送信息,以此类推开始时我的假想,该服务器启动以后,当客户机很多的时候,长时间运行,就会出现连接错乱的情况,请问老大这种情况应该如何避免呢?或者是可以通过怎样的方式来解决?
4294967295 个connection_id,一个进程假设每秒有10个客户端连接上来,循环一次也要13年。
一般来说一个客户端长接连了十几年已经足够用了。
如果是10个进程Gateway进程,一台服务器每秒消耗10个连接id,那么一台服务器发生connection_id被覆盖的几率要大概130年后才能发生,并且这130年有客户端从来没断开过才发生。概率极低。
当然这里也可以做个判断,判断connection_id是否在使用,如果在使用就跳过。
@walkor 2^64-1 = 9223372036854775807 用这个可以么 会有影响么?
用不了9223372036854775807,因为范围超过了unsigned int型。
看到connection_id在进程间传输都是以unsigned int传输的