rpc引起的bug

今天算是又增強(qiáng)了自己對pomelo RPC的認(rèn)識,因?yàn)橐粋€(gè)bug。
起初,我們游戲的角色信息是作為一個(gè)redis緩存對方存放的,有一個(gè)不好的地方就是,如果別的地方調(diào)用該玩家的信息并進(jìn)行修改,就可能會出現(xiàn)兩處數(shù)據(jù)修改,結(jié)果卻只有一處能夠修改成功。

例如:A接口,B接口。都會獲取charInfo并對charInfo 進(jìn)行修改。
先調(diào)用A接口, 在A接口處理邏輯的過程中,調(diào)用了B接口。
這時(shí)候A,B獲取到的charInfo是一樣的,但是,修改的屬性值可能不一樣,在redis設(shè)置緩存的時(shí)候,只能是哪個(gè)最后設(shè)置的,charInfo 修改的屬性值才會生效。比如A修改exp屬性,B修改gold屬性。
A接口先設(shè)置緩存,B后設(shè)置。這時(shí)候,只有g(shù)old屬性值才會被真正的修改。因?yàn)樵贐獲取到的charInfo里沒有修改charInfo.exp. 說白了,就是不是修改的同一個(gè)對象。

所以這次我們將角色信息專門定義了一個(gè)char對象,提供一個(gè)get和一個(gè)set接口。這樣,不論是那個(gè)地方對charInfo 的修改,都是針對同一個(gè)對象的修改。

char對象定義放在data服務(wù)器,其他服務(wù)器例如chat服務(wù)器,要獲取charInfo ,就需要rpc調(diào)用data服務(wù)器的get方法獲取charInfo. 如果在chat服務(wù)器里有對charInfo進(jìn)行修改,則一定要rpc調(diào)用data服務(wù)器的set方法,重新設(shè)置charInfo. 如果data是單個(gè)的服務(wù)器就沒有必要。不過一般至少有三個(gè)data服務(wù)器。

玩家在登陸的時(shí)候,分配一個(gè)data服務(wù)器給當(dāng)前玩家。該玩家的信息就保存在這個(gè)data服務(wù)器的session里。其他data服務(wù)器不會有。這也是為什么其他非data服務(wù)器對charInfo 修改一定要遠(yuǎn)程rpc set一下. 因?yàn)樵谄渌莇ata服務(wù)器下對charInfo 的修改,都修改的不是一個(gè)不同的對象了。一個(gè)服務(wù)器一個(gè)session,一個(gè)charInfo保存在一個(gè)服務(wù)器的session, 這樣就好理解點(diǎn)了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容