为什么我要选择erlang+go进行server架构(2)
原创文章,转载请注明出处: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)的更多相关文章
- Ubuntu下erlang连接SQL SERVER 2008
erlang连接SQL Server使用ODBC方法,但在网络上还是缺少资料,自己折腾了2天才成功.现在特记录下来,以供大家借鉴. 基本思路是 erlang odbcserver + unixodbc ...
- 【目录】sql server 架构篇系列
随笔分类 - sql server 架构篇系列 sql server 高可用镜像 摘要: 一.什么是数据库镜像 基本软件的高可用性解决方案 快速的故障转移恢复(3秒转移),低硬件成本 基于数据库级别的 ...
- 大型站点图片server架构的演进
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/dinglang_2009/article/details/31450731 在主流的Web站点中,图 ...
- 【转】ArcGIS 10.1 for Server 架构
前一段时间在博客中公布了我们的计划,我们采用博客的形式将对ArcGIS10.1 for Server进行全面介绍.但这种形式有一定的遗憾:缺少互动的空间,所以我们希望广大爱好者能将自己感兴趣的话题在博 ...
- 有关于web server架构的一个小疑问
今天闲的时候trace route了yahoo和sina的域名,yahoo的如下: 1 1 ms 1 ms <1 ms 172.21.127.1 2 3 ms ...
- 大并发server架构 && 大型站点架构演变
server的三条要求: 高性能:对于大量请求,及时高速的响应 高可用:7*24 不间断,出现问题自己主动转移.这叫fail over(故障转移) 伸缩性:使用跨机器的通信(TCP) 另外不论什么网络 ...
- Erlang简单并行server
Erlang简单并行服务器 (金庆的专栏) Erlang并行服务器为每一个Tcp连接创建相应的连接进程,处理client数据. 參考 Erlang程序设计(第2版)17.1.3 顺序和并行服务器 并行 ...
- CentOS 6.8 安装 Erlang 及 RabbitMQ Server
安装 Erlang 19.3 # 安装依赖包 yum install -y gcc gcc-c++ unixODBC-devel openssl-devel ncurses-devel # 下载 er ...
- SQL Server架构 -- 数据库文件和文件组
在SQL SERVER中,数据库在硬盘上的存储方式和普通文件在Windows中的存储方式没有什么不同,也是在特定文件夹下创建不同的文件,然后经过文件存储系统去抓取数据信息.理解文件和文件组的概念可以帮 ...
随机推荐
- Socket编程中的强制关闭与优雅关闭及相关socket选项
以下描述主要是针对windows平台下的TCP socket而言. 首先需要区分一下关闭socket和关闭TCP连接的区别,关闭TCP连接是指TCP协议层的东西,就是两个TCP端之间交换了一些协议包( ...
- Vue项目自动转换 px 为 rem,高保真还原设计图
技术栈 vue-cli:使用脚手架工具创建项目. postcss-pxtorem:转换px为rem的插件. 自动设置根节点html的font-size 因为rem单位是相对于根节点的字体大小的,所以通 ...
- Kinect 开发 —— Kinect studio
This tool can record all the data coming into an application from a Kinect unit. You can then view, ...
- Easy mock - 安装配置和基本使用
Easy-mock easy-mock是一款比较好用的接口模拟工具, 使用之前我们需要安装和配置 需要下载的内容有以下 Node Redis MongoDB Node和Redis一路点下一步就行, M ...
- 小米开源文件管理器MiCodeFileExplorer-源码研究(2)-2个单实例工具类
从本篇开始,讲解net.micode.fileexplorer.util工具包中的类.这个包下的类,功能也比较单一和独立.很多代码的思想和实现,可以用于JavaWeb和Android等多种环境中. 一 ...
- 洛谷 P2105 K皇后
P2105 K皇后 题目描述 小Z最近捡到了一个棋盘,他想在棋盘上摆放K个皇后.他想知道在他摆完这K个皇后之后,棋盘上还有多少了格子是不会被攻击到的. (Ps:一个皇后会攻击到这个皇后所在的那一行,那 ...
- Java学习笔记六 常用API对象二
1.基本数据类型对象包装类:见下图 public class Test { public static void main(String[] args){ Demo(); toStringDemo() ...
- Win8.1系统所有的路径都无法更改文件夹名称
平台:win8.1 问题:所有的路径,无论是桌面还是分区还是文件夹内,可以新建和删除文件夹,但不能给文件夹改名,提示“文件或文件夹不存在 ” 分析:安装了几次photoshop后莫名其妙出现这个问题, ...
- BZOJ3697: 采药人的路径(点分治)
Description 采药人的药田是一个树状结构,每条路径上都种植着同种药材.采药人以自己对药材独到的见解,对每种药材进行了分类.大致分为两类,一种是阴性的,一种是阳性的.采药人每天都要进行采药活动 ...
- 异步调用WCF的方法需要小心的地方
直接使用下面的代码,由于client对象占用的资源没有被释放,会导致内存泄露GetSimServiceReference.GetSimServiceClient client = new GetSim ...