用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. 全新 Kali Linux 系统安装指南

    Kali Linux 系统可以说是在安全测试方面最好的开箱即用的 Linux 发行版.Kali 下的很多工具软件都可以安装在大多数的 Linux 发行版中,Offensive Security 团队在 ...

  2. 介绍Docker仓库

    仓库(Repository)是集中存放镜像的地方. 一个容易混淆的概念是注册服务器(Registry).实际上注册服务器是管理仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像.从 ...

  3. Dynamics CRM 本地插件注册器连CRMAn unsecured or incorrectly secured fault was received from the other party

    今天遇到个问题,在本地打开插件注册器连接到远程CRM服务器时报如下问题 但我在CRM服务器上连接注册器是可以打开的,所以不存在账号权限这类的问题了(当然我用的是超管的账号也不可能存在),最后查询得知是 ...

  4. SuperVideo,一款直播,点播,投屏并有的app

    应用名称:SuperVideo应用简介: 1.聚合海量视频,视频源来源于搜狐,乐视,优酷, 腾讯等主流视频网站的丰富视频内容,最新院线大片,热播剧随时看 2.基于百度云解码,享受云解码支持RMVB,M ...

  5. Android必知必会-Android Studio下配置和使用Lambda

    移动端如果访问不佳,请访问–>Github版 背景 和朋友讨论 JAVA8 的新特性,聊到Lambda,正好在掘金上看到一篇相关的文章,结合资料,作一个总结,特别是记录下实际使用中遇到的问题. ...

  6. Java 单元测试 JUnit4 快速入门

    JUnit最佳实践 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public class CardServiceTest {     /**      * 最佳 ...

  7. 剑指Offer——二分查找算法

    剑指Offer--二分查找算法 前言 本片博文主要讲解查找算法的相关知识.重点介绍二分查找. 二分查找算法是在有序数组中用到的较为频繁的一种查找算法,在未接触二分查找算法时,最通用的一种做法是,对数组 ...

  8. Java并发框架——AQS超时机制

    AQS框架提供的另外一个优秀机制是锁获取超时的支持,当大量线程对某一锁竞争时可能导致某些线程在很长一段时间都获取不了锁,在某些场景下可能希望如果线程在一段时间内不能成功获取锁就取消对该锁的等待以提高性 ...

  9. [java面试]javascript中dom取值问题radio名字一样归属于同一个组,求点击的是哪一个

    题目描述: 看如下的html文件,里面定义了一些radio类型的元素,请完成parse()函数的内容,要求能够弹出对话框提示当前选中的是第几个单选框. </pre><pre code ...

  10. Spring事务管理与数据库隔离级别的关系(Spring+mysql)

    之前写过一篇文章<数据库隔离级别(mysql+Spring)与性能分析 >,里面很多问题写的不是很专业,也不是很有逻辑性,现在重新整理一下,希望对大家有帮助. 这部分通过两天时间反复的 ...