Erlang最大的优点是方便,很多基础功能都已经集成到Erlang语言中。之前用C++写服务器的时候,管理TCP连接很繁琐,需要写一大堆代码来实现。底层的框架需要写很多代码实现,这样既浪费时间,又会有很多BUG。但是用Erlang就方便多了,底层的一切你都不需要考虑,你只需要考虑,服务器的架构以及业务逻辑。从此让你彻底从底层的泥潭中解脱。我从去年年底开始了解学习Erlang,到现在我已经彻底爱上了Erlang。好了,废话不多说,开始详细介绍下我设计的这个服务器架构吧。
    首先看下整个架构的布局,如下图:
    
    如上图所示,整个架构由四部分组成,分别是连接管理服务器、账号服务器、游戏服务器以及数据服务器。
    连接管理服务器既网关服务器,主要作用是管理与客户端的网络连接,将服务器组与外网隔离。只有连接服务器中会监听网络连接,连接管理服务器与其他类型的服务器器组成Erlang集群。互相之间通过Erlang消息进行同步。连接管理服务器中会有一个负载平衡节点,用来负责对连接服务器中的所有节点做负载均衡。连接服务器中还有N个网关节点,用来管理客户端连接以及消息传递,网关节点的数量通过负载可动态增加。
    账号服务器,管理整个平台的账号,对客户端做登陆验证,如果项目正式上线还要负责充值的工作。账号服务器由N个节点组成,根据负载可动态增加节点数量。整个架构的数据库都采用Erlang自带的Mnesia分布式数据库,这个数据库既可以做永久保存也可以做Cache,对游戏服务器再合适不过了。Mnesia作为数据永久保存方案,唯一的不足是做数据统计不是很方便。像关系型数据库,有很强大的SQL做支持,做统计那是相当的方便。虽然有不足之处,但是带来的好处也是显而易见的,那就是简单,以及天生对分布式的支持。我在这里为什么不选用MySQL之类的数据库,原因就是Mnesia简单易用,正好符合了KISS原则。我信奉的原则就是KISS,只要能实现我需要的功能,那么实现的越简单越好。复杂意味着不可靠,为什么说不可靠呢,可能有些人觉得我太绝对了,在软件项目中人越多那随之带来的各种BUG也就越多。复杂的系统一定要多人的合作才可以完成,这个是不容置疑的。而且每个人对项目的理解不同,对软件开发的理解也不尽相同,虽然可以统一项目组中每个人的代码风格,但是没有办法统一每个人的思考方式。
    游戏服务器,游戏的所有逻辑都在游戏服务器中实现,对于我现在要做的这款飞行类的页游而言,已经足够了。游戏服务器由N个节点组成,根据负载可动态增加节点数量。游戏数据库也是用Mnesia实现,但是和账号数据库是分离的,他们之间不需要知道互相的存在,从上图也可以看出。如果项目到后期变的更复杂,那游戏服务器这里可以分出单独的节点做复杂的计算,甚至可以把这样的节点单独的隔离到其他的物理机,保证游戏的响应速度。
    总结,架构的游戏世界是个统一的游戏世界,所有用户都在同一个世界中。所有服务器中的节点都是通过负载动态增加的,部署的时候可以部署到同一个物理机上也可以部署到不同的物理机上。做了这么多年的C++服务器,感觉用C++写服务器要实现的东西太多了,要考虑的东西也太多了,让人很累。虽然说是为了效率考虑,但是我觉得如果C++代码写不好,最终的效率反而更不好。我认为一个中级的Erlang程序写出来的服务器可以和一个高级的C++写的服务器程序相媲美,但是培养一个Erlang高手和培养一个C++高手的代价显然是不一样的。

同一世界服务器架构--Erlang游戏服务器的更多相关文章

  1. erlang 游戏服务器开发

    http://blog.csdn.net/slmeng2002/article/details/5532771 最近关注erlang游戏服务器开发  erlang大牛写的游戏服务器值得参考 介绍本文以 ...

  2. 深入浅出node.js游戏服务器开发1——基础架构与框架介绍

    2013年04月19日 14:09:37 MJiao 阅读数:4614   深入浅出node.js游戏服务器开发1——基础架构与框架介绍   游戏服务器概述 没开发过游戏的人会觉得游戏服务器是很神秘的 ...

  3. 老出BUG怎么办?游戏服务器常见问题解决方法分享

    在游戏开发中,我们经常会遇到一些技术难题,而其引发的bug则会影响整个游戏的品质.女性向手游<食物语>就曾遇到过一些开发上的难题,腾讯游戏学院专家团Wade.Zc.Jovi等专家为其提供了 ...

  4. Pomelo分布式游戏服务器框架

    Pomelo介绍&入门 目录 前言&介绍 安装Pomelo 创建项目并启动 创建项目 项目结构说明 启动 测试连接 聊天服务器 新建gate和chat服务器 配置master.json ...

  5. SQLServer 服务器架构迁移

    原文:SQLServer 服务器架构迁移 最近服务器架构迁移,将原来的服务器架构迁移到新的服务器,新的服务器在硬件方面比之前更好!原来服务器使用双向同步,并且为水平划分到多个数据库服务器.迁移过程中, ...

  6. 类似于QQ游戏百万人同时在线的服务器架构实现

    http://blog.csdn.net/sodme/article/details/213995 —————————————————————————————————————————————————— ...

  7. QQ游戏百万人同时在线服务器架构实现

    转载自:http://morton5555.blog.163.com/blog/static/976407162012013112545710/# QQ游戏于前几日终于突破了百万人同时在线的关口,向着 ...

  8. [转]MMORPG服务器架构

    MMORPG服务器架构 一.摘要 1.网络游戏MMORPG整体服务器框架,包括早期,中期,当前的一些主流架构2.网络游戏网络层,包括网络协议,IO模型,网络框架,消息编码等.3.网络游戏的场景管理,A ...

  9. MMORPG服务器架构

    MMORPG服务器架构 一.摘要 1.网络游戏MMORPG整体服务器框架,包括早期,中期,当前的一些主流架构2.网络游戏网络层,包括网络协议,IO模型,网络框架,消息编码等.3.网络游戏的场景管理,A ...

随机推荐

  1. 【NOIP2016后记】

    身在浙江,又跪一年 你哪次正式比赛没跪??? 有的人初三联赛一等前途光明,比如衲姐,周驿东 有的人高一联赛一等为时未晚,比如MG,罗爷爷,陈冲 有的人高二联赛一等纵情声色,比如鸟爷爷,小鸡 有的人高三 ...

  2. 开发使用mysql的一些必备知识点整理(二)查询

    简介 查询的基本语法 select * from 表名; from关键字后面写表名,表示数据来源于是这张表 select后面写表中的列名,如果是*表示在结果中显示表中所有列 在select后面的列名部 ...

  3. Hash Collision DoS 问题

    Hash Collision DoS 问题http://coolshell.cn/articles/6424.html Hash Collision DoS (Hash碰撞的拒绝式服务攻击),有恶意的 ...

  4. VUE之命令行报错:Expected indentation of 4 spaces but found 6

    使用vue时候,经常被一大片警告惊呆了,这是webpack默认的语法检查插件ESLint在做警告, [ESLint是一个语法规则和代码风格的检查工具,可以用来保证写出语法正确.风格统一的代码] 但是我 ...

  5. 牛客网 牛客小白月赛1 A.简单题-控制输出格式setiosflags()函数+setprecision()函数

    水一水博客,都不好意思写这篇博客,毕竟已经不是大一的了. 难得能把一整套题都写出来(日常智障).但是在这里不写G题あなたの蛙は旅⽴っています的题解. 有毒,G题关了流同步只能过94%的样例,说我运行超 ...

  6. Network | NAT

    在计算机网络中,网络地址转换(Network Address Translation或简称NAT),也叫做网络掩蔽或者IP掩蔽(IP masquerading),是一种在IP封包通过路由器或防火墙时重 ...

  7. Codeforces Round #317 [AimFund Thanks-Round] (Div. 2) Minimization dp

    原题链接:http://codeforces.com/contest/572/problem/D 题意 给你个数组A和n,k,问你排列A后,下面的最小值是多少. 题解 先排个序,要填充像1,1+k,1 ...

  8. IntelliJ IDEA ,springboot 2.0 +mybatis 创建和访问数据库

    环境: JDK8+windows10 步骤 New Module —>Spring Initializr—>next 1 ​ 2. ​ 3.web勾选web,sql里面可以不勾,后续添加, ...

  9. 权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现

    权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现 import java.math.BigInteger; import java.util.ArrayLi ...

  10. Python下opencv使用笔记(七)(图像梯度与边缘检測)

    梯度简单来说就是求导,在图像上表现出来的就是提取图像的边缘(无论是横向的.纵向的.斜方向的等等),所须要的无非也是一个核模板.模板的不同结果也不同.所以能够看到,全部的这些个算子函数,归结究竟都能够用 ...