原创文章,转载请注明出处:server非业余研究http://blog.csdn.net/erlib 作者Sunface

为什么我要选择Erlang呢?

一、erlang特别适合中小团队创业:

erlang有异常成熟、经过电信级别大规模验证的OTP应用库,仅仅须要非常easy的代码就能建立起异常稳定、容错性强、扩展性强、高并发的server框架,这也是erlang最宝贵的核心价值所在。

二、erlang是天生的并发语言:

erlang的并发特性是语言级别的,从开发伊始就採用了CSP并发模式, 以进程为单位,进程间没有共享内存,变量不可变的实现方式保证了无锁的并发模型,因此也是异常高效的,换句话说:你仅仅要像寻常一样写代码就能并发,全然不用担心不论什么底层实现,你的代码能完美的并行执行在多核server上,假设你能写出美丽的并发级别的算法和代码(尽量少的顺序代码),那在32核机器上就能跑出32倍性能!!!! Go 语言的并发模型也是取经于Erlang,可是我觉得Erlang的并发模型更优秀,由于进程间全然没有共享内存,全然无锁。

三、再介绍下我当初的业务需求:

一款多人在线游戏,一个玩家走一步都要把消息广播给同屏的玩家,玩家聊天,战斗更涉及到大量的消息广播;怎样应对?再有一个及其普通却不太easy搞定的的需求:在线玩家列表怎么实现?是啊,你是不是在想用哪种锁合适?提到的两个场景的关键词是:高并发,大量广播;可能你还会想到"锁".

我尝试过在.net下使用完毕port+TPL库+protocol buffer来完毕上面的功能,可是并没有通过測试的检验,測试模型是聊天.在收发消息方面,client和server一对一的收发压力不大,可是一旦开启广播,压力一下就上去了.对象的频繁创建会导致垃圾回收,而垃圾回收会导致CPU和内存都飘忽不定,中间增加对象池会得到一定缓解,可是不能彻底解决这个问题,然后想到的就是人为干预垃圾回收,推断标准是什么呢?那就是用PerformanceCounter吧,结果发现PerformanceCounter一次调用分配的内存相当大!最后一版的结果是:聊天室模型,一人说话广播给全部人,300人在线可以稳定,人数一多就開始不淡定了.这些都是经过量化分析得出的结果,使用的工具是Visual Studio2010中的Performace Profile工具.

须要解决的第二个问题就是并发加锁,最简单的測试模型就是在线玩家列表.这个问题相同困扰了我非常久,尝试各种锁,还是在抛异常,要么就是性能的下降,问题此起彼伏.兴许还要解决TCP通信的数据格式,以及粘包等问题......

项目时间紧张,存在的风险非常多,要尽快把技术方案确定下来然后去推进别的事情;可是可供选择的方案有C++和Erlang.坦白讲我和团队的基础假设使用C++方案,一定能搞出来,可是排错和性能优化将是一个巨大的挑战.那么Erlang呢?从开篇引用的那段文字看,好像这就是我须要的,简单了解了一下语法,还是非常惊喜,因为之前对F#有过接触,一下感觉非常亲切.并且我特别关注到:

长处:

1.面向并发,有成熟并且久经考验的框架可供使用,网络部分已经经过了良好封装

2.内存缓存解决方式进程字典,前者的读写速度是50NS-100Ns级别的

3.对二进制数据解析的语法是直观,简单,强大(游戏中有大量的二进制数据要处理

4.没有共享内存! 没有锁!(我们在代码中没有过显示使用锁)

缺点

1.从一种语言过渡到还有一种语言,会有各种不爽:

2.控制逻辑简单仅仅有if 和 case ,并且有if没有else,没有continue break goto

3.包含kernel库和standlib库在内,非常多函数和变量的命名和传统语言不一样

因此我们就决定了採用erlang来又一次写一套全新的架构,事实证明当初的决定是无比正确的,一个极少须要重新启动、能热更、稳定的游戏server实在是太重要了,并且开发过程和维护是如此的高速和轻松,我们的团队一致觉得:从来没有想过开发会是这么一件愉快的事情!

既然Erlang已经被我“吹”的快飞起来了,为什么还要使用Go?

   鉴于Go语言已经妇孺皆知了,我也就不介绍了,大概说说我自己的情况,我这人没啥其它兴趣爱好,业余时间绝大部分都花费在所谓的“程序猿要不停的学习才不会落伍”上,因此在11年的时候,知道了go,断断续续学习了一年后,Go1.1版本号出来后,发现改进非常大,就開始认真研究并常年混迹在google-group及国外大牛的博客世界中,自我感觉还能够。当然我绝对不是Go的“朝圣者”,也发现Go确实不是非常完美,详细能够參见“为什么我要放弃Go“,此文作者的观点我尽管不敢全然苟同,可是有些观点还是赞同的,比方说非常多Go爱好者是非常护短的,假设你敢说什么“坏话”,就等着被查水表吧 ;)。

项目 nodejs python c++/ruby erlang golang
体系成熟 4 3 5 5 3
开发效率 5 5 3 4 5
性能 3 3 5 5 4
加密公布 3 0 4 3 5
逻辑简单 5 5 3 4 5
易学易用 5 5 2 5 4
跨平台 5 5 5 5 5

从上表中能够看出 erlang和go之间的互补性还是非常好的,Go的体系成熟度确实还有待提高

因为Erlang和Go都是非常棒的语言,这里就出现一个问题:二选其一还是物尽其用?经过深思熟虑后,我和团队选择了后者。首先,erlang的OTP写server并发框架非常之简单、稳定且高性能,erlang的Mnesia数据库也是非常轻量:速度非常快,分布式简单,使用起来也非常原生态(是Erlang标准库支持的),全部的这些都能把程序猿从繁琐的工作中解放出来,可是,erlang也有个挺重要的问题(在不同业务场景中此问题或许非常突出,也可能全然无关紧要,至少85%的情况下不算一个问题):它是虚拟机语言,对于顺序代码的运行速度仅仅有C的七分之中的一个,尽管能够利用多核的优势,可是在大型mmorpg中,消息密集时,CPU的瓶颈还是挺明显的,会影响玩家顺畅的体验感觉(ARPG)。

因此我就想假设逻辑这部分用Go来写,是不是能够非常好的利用这两个语言的长处进行互补?心动不如行动,由于我们的erlang游戏架构的藕合度还是挺低的,因此分离出来地图server,用Go又一次实现了下,通过socket跟erlang架构部分进行通信,发现效果异常之好,Go的性能、并发的原生支持再配合上erlang写游戏框架,在性能上已经绝不亚于C++框架,可是后者大家都懂,中关村程序猿据说平均寿命50多岁,非常大的一部分原因是由于这个。

以后的路怎么走?

    混合型编程会是以后的主流,由于没有哪个语言是完美的,包含被众多“朝圣者”所推崇的Go,假设我们能依据自己的业务场景,选对合适的语言,那不敢说事半功10倍,至少事半功倍应该是有的,所以不要被主流语言(Java,C++)禁锢了我们的世界,局限了我们的创新,假设能做到轻松愉快的开发,那这个世界该多美好!!

为什么我要选择erlang+go进行server架构(2)相关推荐

  1. 为什么我要选择erlang+go进行服务器架构(2)

    原创文章,转载请注明出处:服务器非业余研究http://blog.csdn.net/erlib 作者Sunface 为什么我要选择Erlang呢? 一.erlang特别适合中小团队创业: erlang ...

  2. Erlang与Java内存架构

    我读了一篇关于Erlang VM的内存管理策略的非常非常有趣的文章. 它是Jesper Wilhelmsson撰写的论文 ,我认为讨论Erlang的内存设置和Oracle的Java VM之间的差异可能 ...

  3. Parameter Server架构

    Parameter Server架构 现在的机器学习系统,但凡是大一点的公司,恐怕都在用分布式了.而在分布式机器学习领域,最出名的恐怕就是少帅的PS框架了.在本博文里,PS框架特指第三代PS框架,即少 ...

  4. sql server 架构_在SQL Server中引入架构文档

    sql server 架构 描述 (Description) We often have a need to view object definitions in SQL Server, whethe ...

  5. sql azure 语法_Azure Data Studio中SQL Server架构比较扩展

    sql azure 语法 This article explores the SQL Server Schema Compare extension in the Azure Data Studio. ...

  6. 如何为你的企业选择示例性 Web 应用架构?

    如果您曾经使用 Spotify 听过您最喜欢的音乐,那么您就是在使用具有最佳架构之一的 Web 应用程序.正如Spotify 的工程师所说,他们利用了一种分区架构,其中每个功能都相互独立.因此,如果一 ...

  7. Eclipse里选择Servlet Run As Server后,自动生成了哪些资源?

    新建一个Servlet: 选择Run as Server: 我的Apache Tomcat server的配置: tree /F命令的显示结果: 最重要的是HelloServlet.class: je ...

  8. SQL SERVER 架构管理

    架构特点: 架构是数据库级的安全对象,是数据库中表.视图.存储过程等对象的容器,是形成单个命名空间的数据库实体的集合,一个架构只能有一个拥有者. 将所有权与架构分离的意义: ①架构所有权和架构范围内的 ...

  9. Ambari 架构(三)Ambari Server 架构

    Ambari Server 架构图,由图中看,主要有4部分: Resource Service:资源服务,用来接收前端的 Rest 请求.关于 Resource 的几个基本概念: Resource:A ...

最新文章

  1. Bert系列(三)——源码解读之Pre-train
  2. TIME_WAIT状态及存在原因
  3. 配置webpack.config.js遇到的一些问题
  4. 微信小程序css之线性渐变
  5. mac共享文件夹 linux,一文搞定 Linux,Mac,Windows 的 NFS 网络文件共享服务部署
  6. http响应返回的状态码
  7. python 内置函数_python的内置函数、方法
  8. CentOS Samba服务器的搭建与配置(share共享模式)
  9. 禁用win10触摸屏手势_怎样禁用、启用Win10平板边缘滑动手势
  10. 企业必须面对云计算时代
  11. 讯飞离线语音合成(离线资源包)
  12. SSDT表函数Hook原理
  13. Kafka的监控以及运维与Kafka-eagle的安装
  14. 以index.wxml为例解析WXML
  15. rust旋转摆放_Rust | 种植房教程(新版) - Tamura77
  16. 每个工程师都应该知道的 5 个射频发射器测量指标(自NI官网翻译)
  17. Python学习资源
  18. macOS - Cocoa开发之沙盒机制及访问Sandbox之外的文件
  19. R语言包(package)以及相关命令语句
  20. Linux欧姆单位怎么打,万用表如何进行欧姆校零

热门文章

  1. dao层如何调用对象_你的项目应该如何正确分层?
  2. 实时屏幕监控 linux面板,分享|LXDE、Xfce 及 MATE 桌面环境下的又一系统监视器应用:Multiload-ng...
  3. java se5和8_javaSE_8系列博客——Java语言的特性(三)--类和对象(5)--定义方法...
  4. html5 密码框明文,elementUI的密码框的密文和明文
  5. java定义private_java9开始——接口中可以定义private私有方法
  6. mongoose换成mysql_Package - tms-koa
  7. flutter 分割线_Flutter 底部弹框 showModalBottomSheet 使用Demo
  8. 运维人员mysql如何访问_mysql 运维常见操作
  9. .net 从txt中读取行数据_【VBA项目】从指定文件中读取数据并绘制图表
  10. android 资源如何下沉,关于Android业务模块下沉的一些实践及总结