用Zmq实现网关与游戏服全互连
用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实现网关与游戏服全互连的更多相关文章
- 游戏全区全服和分区分服 QQ斗地主的设计
游戏全区全服和分区分服 QQ斗地主的设计 https://cloud.tencent.com/community/article/164816001481011910?fromSource=gwzc ...
- 简单Elixir游戏服设计- 游戏玩法介绍
抄以前的,做了点修改. 到目前为止,我们完成了玩家的数据和进程建模,现在介绍游戏玩法. 为什么我们还不做客户端接入.协议指定呢?为什么还没有网关和数据存储呢.在我接手的游戏, 这些通常已经定下来了,我 ...
- 云平台 为什么推荐使用小VM 而不是大VM独占宿主机的方式部署游戏服?
近期公司X游戏项目,提了一个游戏VM资源的需求,是 64GB RAM + 30Core CPU 的VM规格,而一个VM部署10个游戏服.而我们云平台推荐的VM规格为 4 Core CPU + 4GB ...
- 游戏服java程序启动,显示内存溢出
1.OutOfMemoryError:Java heap space 过程:服务器上面的mysql突然异常重启,导致了程序启动的时候报错 问题1:OutOfMemoryError:Java heap ...
- win7系统玩游戏不能全屏的解决办法
1.修改注册表中的显示器的参数设置 Win键+R键,打开运行窗口,输入regedit回车,这样就打开了注册表编辑器,然后,定位到以下位置: HKEY_LOCAL_MACHINE\SYSTEM\ ...
- 国内开源html5游戏引擎全收录
本文引自<国内开源html5游戏引擎全收录> 游戏开发这潭水太深,英文水平太差,不敢看国外的, 而且这几年国内技术水平也挺高了不少,特别是JS方面.(我个人感觉) 最近看了几个国产的js游 ...
- 关于Elixir游戏服设计系列
写着写着就废球了,感觉空对空,实在没什么意思. 另外很快就要搞新项目,决定新项目就直接上elixir了.目前该做的准备工作已经探索了一些了. 以下的东西是写给同事参考的,感兴趣的可以看看,提建议更好. ...
- Elixir游戏服设计五
在<Elixir游戏服设计一>里提到,按照系统功能划分成app要保证原子性很难, 现在想想也没那么难.保证原子性,无非就是需要某个单点去完成操作.那么选择玩家进程去做原子性工作就可以了. ...
- Elixir游戏服设计一
在Erlang游戏服设计总结http://www.cnblogs.com/rubyist/p/5530575.html里, 我提到我想要的游戏服设计方法,希望以应用做为基础构建块.最近我在学习elix ...
随机推荐
- Docker 数据卷容器
如果你有一些持续更新的数据需要在容器之间共享,最好创建数据卷容器. 数据卷容器,其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的. 首先,创建一个命名的数据卷容器 dbdata: $ sud ...
- SQL Server 虚拟化(2)——理想的SQL Server虚拟机架构
本文属于SQL Server虚拟化系列 搭建SQL Server虚拟机,在各个组织之间都有自己的标准和最佳实践.从第一眼看去,光物理配置就有过百种,所有的这些细微差别都有可能为后续日常管理过程中故障侦 ...
- Spark核心类:弹性分布式数据集RDD及其转换和操作pyspark.RDD
http://blog.csdn.net/pipisorry/article/details/53257188 弹性分布式数据集RDD(Resilient Distributed Dataset) 术 ...
- PHP学习(1)——我为什么要学PHP
PHP简介 PHP是一种服务器端的脚本语言,特别适合做web开发.高效.灵活.实用是PHP的特点.PHP最开始是Personal Home Page的缩写,后来正式更名为了"PHP:Hype ...
- Dynamics CRM2013 6.1.1.1143版本插件注册器的一个bug
最近在做的项目客户用的是CRM2013sp1版本,所以插件注册器使用的也是与之对应的6.1.1.1143,悲剧的事情也因此而开始. 在插件中注册step时,工具里有个run in user's con ...
- Gazebo與ROS版本說明
使用哪种ROS / Gazebo版本的组合 介绍 本文档提供了有关将不同版本的ROS与不同版本的Gazebo结合使用的选项的概述.建议在安装Gazebo ROS包装之前阅读它.重要!简单的分析,快速和 ...
- 大页内存(HugePages)在通用程序优化中的应用
今天给大家介绍一种比较新奇的程序性能优化方法-大页内存(HugePages),简单来说就是通过增大操作系统页的大小来减小页表,从而避免快表缺失.这方面的资料比较贫乏,而且网上绝大多数资料都是介绍它在O ...
- webStorm破解
B4A73YYJ-eyJsaWNlbnNlSWQiOiI0M0I0QTczWVlKIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNzaWduZWVOYW1lIjoiIiw ...
- FFmpeg源代码简单分析:avcodec_close()
===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...
- T-SQL 中的CROSS JOIN用法(半翻译)
突然发现个很吊的链接,我们来看看学习数据库要做些什么,胆小慎点:DBA工作内容!!!! 今天来翻译一篇关于T-SQL的文章,本文可供微软认证70-461:QueryingMicrosoft SQL S ...