请教关于session和异步任务的两个疑问

defeatlr

项目使用GatewayWorker,碰到两个小问题求教
1.在Events中onMessage中,假设有3000个设备发消息过来,我把每个设备的id都存入到$_SESSION中,这里大量操作$_SESSION会不会造成业务堵塞?

因为每天设备上发数据量比较大,都先写入REDIS,现在想用异步任务去读取redis队列中的数据然后写入MYSQL,如果开了多个进程去取数据,会不会造成重复写入

另外问个项目实现思路的问题:
现在服务器A上单独跑了GW来处理硬件上报数据,然后另外服务器B上WEB后台需要获取硬件的在线状态

我现在的做法是单独开了websocket协议的gateway,然后WEB后台连上来,服务器A中GW接收数据,
大概代码是这样

if (!isset($_SESSION)) {
    // 需要从message中取出设备的ID
    $arr = explode('\n', $message);
    foreach ($arr as $str) {
        $uid = xxxxx;
    }
    $_SESSION = $uid;
    Gateway::bindUid($client_id, $uid);
}

然后,在onClose方法中用
Gateway::sendToUid('WEB后台uid', $deviceId);
推送数据来完成通知某个设备下线了
请问这样处理是否合理或者还有其他更简便的方法来实现
万分感谢!!!

2423 1 0
1个回答

walkor

1、gatewayWorker的Session是存储在内存里的,$_SESSION是异步存取的,不会造成业务阻塞。Gateway::getSession/SetSession这些是同步接口,会造成阻塞,但是也很快

2、理论上会造成重复

3、合理,已经很便捷

年代过于久远,无法发表回答
🔝