请教一下大神websocket发送的数据会因延迟造成变化不?

daohu

假设前端有下面的语句

t=4;
socket.send(JSON.stringify({"t": t}));
t+=1;

后端会不会在网络不好的情况下收到5?
该情况用在比如加钻石数时,前端同步更新,后端会和前端发来的数值t=4进行比对,如果符合就+1,不符合就报作弊,现在误报作弊的情况偶尔发生,但不是每次都发生,排查了很多问题,现在只能怀疑是这个了,像是因网络不好造成了传到后端的是5?如果是这个情况,一般通信中前端同步更新应该怎么做避免数据错乱呢?

6643 2 0
2个回答

walkor

tcp会自己保证顺序,所以同一个tcp连接发送的数据不会错乱

  • daohu 2017-08-10

    好的,谢谢大神,那我再好好检查下可能的其他原因

  • daohu 2017-08-10

    测了好久,还是会时不时的报错,代码逻辑又没有找到问题,我现在推测和我服务端初始化时用了global去全局数据库以及从数据库读取的一排数组存在变量里有关。当服务端收到传过来的t==4时,global t,然后比较这两个t是否相等,因为global失效t为null,所以数值不等,所以报错。有没有可能是global 失效造成的,大神?

walkor

进程间的变量是 不同步的,
把进程数改成1试下,有可能是你们业务没考虑到多进程导致的

  • daohu 2017-08-10

    目前设置的是4,是Gateway和BusinessWorker里的count都改为1吗?我先测一测,看是不是这个问题。同样,反过来测或许更能说明问题,是不是我进程数越多,出错的几率就越大?每次onMessage接受到消息都会随机给不同的进程处理吗?
    如果是的话又想用多进程需要怎么设置全局变量才不会报错呢,这个如果一两句话说不清可以推荐资料我自己去看,再次感谢大神解答

  • walkor 2017-08-10

    多进程都需要共享的数据放到数据库或者redis里共享

  • daohu 2017-08-10

    @1:redis我可以去了解下,数据库的话岂不是每次有数值比对都要从数据库取一次数据,感觉好麻烦,多进程是不是等于就不能使用全局global了,因为变量不同步必然会带来错误的可能

  • stephen 2017-08-10

    用 GlobalData 组件去同步数据会很快

  • daohu 2017-08-11

    @1531:谢谢,我去看看手册

  • daohu 2017-08-11

    @1:大神,测试了下,进程数都改成1了,还是遇到这个问题,感觉像是global里的值有误,或者收到了其他会话的干扰

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