项目使用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);
推送数据来完成通知某个设备下线了
请问这样处理是否合理或者还有其他更简便的方法来实现
万分感谢!!!
1、gatewayWorker的Session是存储在内存里的,$_SESSION是异步存取的,不会造成业务阻塞。Gateway::getSession/SetSession这些是同步接口,会造成阻塞,但是也很快
2、理论上会造成重复
3、合理,已经很便捷
感谢walkor大神耐心指导!!!