热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

同一世界服务器架构Erlang游戏服务器

  Erlang最大的优点是方便,很多基础功能都已经集成到Erlang语言中。之前用C++写服务器的时候,管理TCP连接很繁琐,需要写一大堆代码来实现。底层的框架需要写很多代码实现
    Erlang最大的优点是方便,很多基础功能都已经集成到Erlang语言中。之前用C++写服务器的时候,管理TCP连接很繁琐,需要写一大堆代码来实现。底层的框架需要写很多代码实现,这样既浪费时间,又会有很多BUG。但是用Erlang就方便多了,底层的一切你都不需要考虑,你只需要考虑,服务器的架构以及业务逻辑。从此让你彻底从底层的泥潭中解脱。我从去年年底开始了解学习Erlang,到现在我已经彻底爱上了Erlang。好了,废话不多说,开始详细介绍下我设计的这个服务器架构吧。
    首先看下整个架构的布局,如下图:
    同一世界服务器架构--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++高手的代价显然是不一样的。

推荐阅读
  • 一文了解消息中间件RabbitMQ
    消息中间件---RabbitMQ1消息中间件的作用2.常用的消息中间件3消息中间件RabbitMQ3.1RabbitMQ介绍3.3RabbitMQ的队列模式3.3RabbitMQ的 ... [详细]
  • 本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ... [详细]
  • MySQL Debug 模式的实现与应用
    本文详细介绍了如何启用和使用 MySQL 的调试模式,包括编译选项、环境变量配置以及调试信息的解析。通过实际案例展示了如何利用调试模式解决客户端无法连接服务器的问题。 ... [详细]
  • 前言无论是对于刚入行工作还是已经工作几年的java开发者来说,面试求职始终是你需要直面的一件事情。首先梳理自己的知识体系,针对性准备,会有事半功倍的效果。我们往往会把重点放在技术上 ... [详细]
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • 本文将深入探讨MySQL与MongoDB在游戏账户服务中的应用特点及优劣。通过对比这两种数据库的性能、扩展性和数据一致性,结合实际案例,帮助开发者更好地选择适合游戏账户服务的数据库方案。同时,文章还将介绍如何利用Erlang语言进行高效的游戏服务器开发,提升系统的稳定性和并发处理能力。 ... [详细]
  • MongoDB的核心特性与架构解析
    本文深入探讨了MongoDB的核心特性,包括其强大的查询语言、灵活的文档模型以及高效的索引机制。此外,还详细介绍了MongoDB的体系结构,解释了其文档、集合和数据库的层次关系,并对比了MongoDB与传统关系型数据库(如MySQL)的逻辑结构。 ... [详细]
  • docker镜像重启_docker怎么启动镜像dock ... [详细]
  • 本文介绍了如何通过在数据库表中增加一个字段来记录文章的访问次数,并提供了一个示例方法用于更新该字段值。 ... [详细]
  • 深入解析Spring Cloud微服务架构与分布式系统实战
    本文详细介绍了Spring Cloud在微服务架构和分布式系统中的应用,结合实际案例和最新技术,帮助读者全面掌握微服务的实现与优化。 ... [详细]
  • 如何从python读取sql[mysql基础教程]
    从python读取sql的方法:1、利用python内置的open函数读入sql文件;2、利用第三方库pymysql中的connect函数连接mysql服务器;3、利用第三方库pa ... [详细]
  • MySQL 'Too Many Connections' 错误处理及优化方案
    本文详细介绍了如何诊断和解决MySQL数据库中出现的‘Too Many Connections’错误,包括查看当前连接状态、调整配置文件以及优化应用代码等方法。 ... [详细]
  • 最新计算机专业原创毕业设计参考选题都有源码+数据库是近期作品ling取参考你的选题刚好在下面有,有时间看到机会给您发1ssm资源循环利用2springboot校园考勤系统3ssm防 ... [详细]
  • 为何我选择了华为云GaussDB数据库
    本文分享了作者选择华为云GaussDB数据库的理由,详细介绍了GaussDB(for MySQL)的技术特性和优势,以及它在金融和互联网行业的应用场景。 ... [详细]
  • 本文探讨了2019年前端技术的发展趋势,包括工具化、配置化和泛前端化等方面,并提供了详细的学习路线和职业规划建议。 ... [详细]
author-avatar
霸气的艳子_612
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有