mina & protocol buffers

今天拿mina和protocol buffers写了一个简单的TCP Server。http://code.google.com/p/uniqname/

一款网络游戏通常会分为很多组服务器,各组服务器之间数据基本是不通的,而且经常要合并。拿魔兽世界来说,合服的时候总是2合一,一个主服,一个副服。副服的一个角色名如果和主服上的某个角色重复,那么这个人就会被迫改名,否则不能进入游戏。同时,好友列表、帮派等社交关系也会被清空。(3.x时代的魔兽世界)

那么一个好一点的办法就是,从一开始就为服务器划好区,每个区有一个唯一名服务器,玩家创建角色的时候就做好重名检查,让同一个区(而不仅仅是本服)的角色名不重复。那么合服的时候,玩家感受会好一点。

唯一名服务器最重要的一个接口就是allocate(String name),判断一个名字是否已被占用,否则就占了它。

实现起来很简单,但是我想写一套新的RPC框架,而不是用现有的比如JMX、RMI、WebService之类的,于是就想把mina和protocol buffers配合起来。用mina做IO管理,用protocol buffers定义message、service、method。网上虽然有一个这样的实现,但是它用的是短连接,每次请求都会产生一个新的TCP连接,而我想要长连接,因为短链接需要像HTTP那样自己在用户层增加字段来维护session。

我觉得所有的RPC实现,最大的麻烦就是如何处理out-of-band信息,比如传输层超时、比如对方抛出了一异常、如何获取peer address,如何为这些东西定义好恰当的接口,是很头疼的事情。google protocol buffers在每个函数都加了一个Controller对象,但是并没有文档描述它设计这个的动机是什么。这个Controller到底是每个Service一个,还是每个Server一个,还是每次收到请求的时候都创建一个新的?把它当Session用可不可以?貌似google还是建议你不要用,如果有这方面的需求,那么就给protoc写plugin吧。

回来的路上我又在想,传统的模式是 Client-> GameServer-> Uniqname Server。往往,直接与Client交互的Server只有一个,而它经常是在做请求代理。但是如果引入 Kerberos 这样的东西,让Client直连每个Server呢?比如Client先去uniqname要一个名字,uniqname server不仅告诉它是否成功,还会给一个签名和一个timestamp。之后Client把这个名字和timestamp一起发给GameServer。

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥