rpc引起的bug
今天算是又增强了自己对pomelo RPC的认识,因为一个bug。
起初,我们游戏的角色信息是作为一个redis缓存对方存放的,有一个不好的地方就是,如果别的地方调用该玩家的信息并进行修改,就可能会出现两处数据修改,结果却只有一处能够修改成功。
例如:A接口,B接口。都会获取charInfo并对charInfo 进行修改。
先调用A接口, 在A接口处理逻辑的过程中,调用了B接口。
这时候A,B获取到的charInfo是一样的,但是,修改的属性值可能不一样,在redis设置缓存的时候,只能是哪个最后设置的,charInfo 修改的属性值才会生效。比如A修改exp属性,B修改gold属性。
A接口先设置缓存,B后设置。这时候,只有gold属性值才会被真正的修改。因为在B获取到的charInfo里没有修改charInfo.exp. 说白了,就是不是修改的同一个对象。
所以这次我们将角色信息专门定义了一个char对象,提供一个get和一个set接口。这样,不论是那个地方对charInfo 的修改,都是针对同一个对象的修改。
char对象定义放在data服务器,其他服务器例如chat服务器,要获取charInfo ,就需要rpc调用data服务器的get方法获取charInfo. 如果在chat服务器里有对charInfo进行修改,则一定要rpc调用data服务器的set方法,重新设置charInfo. 如果data是单个的服务器就没有必要。不过一般至少有三个data服务器。
玩家在登陆的时候,分配一个data服务器给当前玩家。该玩家的信息就保存在这个data服务器的session里。其他data服务器不会有。这也是为什么其他非data服务器对charInfo 修改一定要远程rpc set一下. 因为在其他非data服务器下对charInfo 的修改,都修改的不是一个不同的对象了。一个服务器一个session,一个charInfo保存在一个服务器的session, 这样就好理解点了。