用Zmq实现网关与游戏服全互连

(金庆的专栏)

Zeromq无需bind, connect次序,可以在对方bind之前就connect, 可实现服务器以任意顺序启动。
Zmq有自动重连功能,可实现服务器故障重启不影响整个系统。

万神服务器内部连接采用了Zmq, 并可能在未来将客户端服务器之间的连接也改用为Zmq。

万神的网关(Gtw,Gateway)与游戏服(Gs, Game Server)之间是M*N的全互连关系。
即M个网关,N个游戏服,每个Gtw连接所有Gs, 每个Gs连接所有Gtw.
采用Zmq的Router-Router模式,Gtw和Gs分别只需一个zmq::socket_t, 就可以实现M*N互连。

Router-Router互连的决窍是至少其中一方须设置ZMQ_IDENTITY.
因为Gs是稳定的服务器,数量固定,所以设为bind方,并设置 ZMQ_IDENTITY.
Gtw是可任意添加的服务器,所以设为connect方,使用自动ZMQ_IDENTITY.
ZMQ_IDENTITY就是socket的名字。
Gtw向Gs发送消息时,须先指定对方的名字,然后才能发送到指定的Gs.
接收时,也会附带获取对方的名字。
Gtw是自动ZMQ_IDENTITY,每次连接Gs, Gs就会自动为其设定一个随机的名字。
Gtw重启后,希望其名字与前次运行的名字不相同,所以设为自动ZMQ_IDENTITY.

Gs端只需一次bind:
    zmq::socket_t sktGs(context, ZMQ_ROUTER);
    sktGs.setsockopt(ZMQ_IDENTITY, ...);
    sktGs.bind("tcp://*:12345");
    
Gtw端须连接多个Gs, Gs的IP和端口是配置的:
    zmq::socket_t sktGtw(context, ZMQ_ROUTER);
    BOOST_FOREACH(int nGsId, setGsIds);
    {
        sktGtw.connect(Fmt("tcp://%s:%u",
            config.GetGsHost(nGsId),
            config.GetGsPort(nGsId)));
    }

Gtw重启后,应该假设此时Gs可能尚未存在,须不断向Gs发Init消息。
Gs应答InitAck之后就可以确认与Gs之间的连接建立成功。
Gs的名字是从配置文件读取的。

Gs重启后,将等待Gtw的消息,如果是Init, 则应答InitAck.
如果是其他消息,则发送Reset, 让Gtw重置。
Gtw接到Reset后,将发送Init, 并等待InitAck.

如此,Gs与Gtw将不存在启动顺序关系,并且服务器可任意重启而不影响其他服务器。

用Zmq实现网关与游戏服全互连的更多相关文章

  1. 游戏全区全服和分区分服 QQ斗地主的设计

    游戏全区全服和分区分服  QQ斗地主的设计 https://cloud.tencent.com/community/article/164816001481011910?fromSource=gwzc ...

  2. 简单Elixir游戏服设计- 游戏玩法介绍

    抄以前的,做了点修改. 到目前为止,我们完成了玩家的数据和进程建模,现在介绍游戏玩法. 为什么我们还不做客户端接入.协议指定呢?为什么还没有网关和数据存储呢.在我接手的游戏, 这些通常已经定下来了,我 ...

  3. 云平台 为什么推荐使用小VM 而不是大VM独占宿主机的方式部署游戏服?

    近期公司X游戏项目,提了一个游戏VM资源的需求,是 64GB RAM + 30Core CPU 的VM规格,而一个VM部署10个游戏服.而我们云平台推荐的VM规格为 4 Core CPU + 4GB ...

  4. 游戏服java程序启动,显示内存溢出

    1.OutOfMemoryError:Java heap space 过程:服务器上面的mysql突然异常重启,导致了程序启动的时候报错 问题1:OutOfMemoryError:Java heap ...

  5. win7系统玩游戏不能全屏的解决办法

    1.修改注册表中的显示器的参数设置   Win键+R键,打开运行窗口,输入regedit回车,这样就打开了注册表编辑器,然后,定位到以下位置:   HKEY_LOCAL_MACHINE\SYSTEM\ ...

  6. 国内开源html5游戏引擎全收录

    本文引自<国内开源html5游戏引擎全收录> 游戏开发这潭水太深,英文水平太差,不敢看国外的, 而且这几年国内技术水平也挺高了不少,特别是JS方面.(我个人感觉) 最近看了几个国产的js游 ...

  7. 关于Elixir游戏服设计系列

    写着写着就废球了,感觉空对空,实在没什么意思. 另外很快就要搞新项目,决定新项目就直接上elixir了.目前该做的准备工作已经探索了一些了. 以下的东西是写给同事参考的,感兴趣的可以看看,提建议更好. ...

  8. Elixir游戏服设计五

    在<Elixir游戏服设计一>里提到,按照系统功能划分成app要保证原子性很难, 现在想想也没那么难.保证原子性,无非就是需要某个单点去完成操作.那么选择玩家进程去做原子性工作就可以了. ...

  9. Elixir游戏服设计一

    在Erlang游戏服设计总结http://www.cnblogs.com/rubyist/p/5530575.html里, 我提到我想要的游戏服设计方法,希望以应用做为基础构建块.最近我在学习elix ...

随机推荐

  1. CMS垃圾收集器

    介绍 CMS垃圾回收器的全称是Concurrent Mark-Sweep Collector,从名字上可以看出两点,一个是使用的是并发收集,第二个是使用的收集算法是Mark-Sweep.从而也可以推测 ...

  2. 给PLSQL插上飞翔的翅膀-PLSQL优化

    60-80% of database performance issues are related to poorly performing SQL,60-80%的数据库性能问题要归结于生产中糟糕的S ...

  3. post插件

    分享牛系列,分享牛专栏,分享牛.在项目开发中,http请求方式是最常见的了.怎么模拟http请求呢?方法有很多种,可以使用httpclient直接模拟请求,也可以使用火狐post插件方式,这个章节主要 ...

  4. activiti uuid主键

    1.1.1.  activiti默认主键生成方式 ; 下面我们看一下主键的生成策略:主键的生成策略定义在IdGenerator接口中,接口定义如下所示: public interface IdGene ...

  5. Scikit-learn:模型评估Model evaluation

    http://blog.csdn.net/pipisorry/article/details/52250760 模型评估Model evaluation: quantifying the qualit ...

  6. 在代码中写view 的长宽高等

    获得资源的id的另一种方法 int layoutRes = getResources().getIdentifier("pager_view" + i, "layout& ...

  7. Spark技术内幕: Shuffle详解(三)

    前两篇文章写了Shuffle Read的一些实现细节.但是要想彻底理清楚这里边的实现逻辑,还是需要更多篇幅的:本篇开始,将按照Job的执行顺序,来讲解Shuffle.即,结果数据(ShuffleMap ...

  8. 如何查看App provision profile文件中的钥匙链访问组名称

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我们因为某些原因希望安全的在多个App中共享一些信息,我们可以 ...

  9. 为何不能在viewDidLoad方法中显示其他视图

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 你可以使得当视图控制器(view controller)显示自 ...

  10. FFmpeg源代码简单分析:avformat_open_input()

    ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...