我为什么要用erlang来做服务器端

刚和朋友交流,就服务器端的开发语言选择,做了些讨论。这里记录一
下概要。

按照一般的理解,我用C/C++做服务器端会更符合我的习惯,因为我对
C/C++要比erlang要熟悉,要更顺手,而且,也用C/C++弄过服务器,设计
过基于C/C++的服务器架构。但我个人还是更愿意选择erlang

首先是设计方便,大约在07年还是08年的时候,那个时候在konami弄的
移植用的软件架构消停的时候,有一段空闲时间,就开始考虑快速的服务
器开发架构这块,当时是想采用lua或者其他的比如python的,因为对lua
更了解些,就写了个使用lua脚本的架构,但随着想要的越来越多,发现我
的架构并不是我所需要的,我需要的是一个足够的灵活,足够的高效,修
改需要可以实时反映出来,而且,还要像搭积木一样,可以随意组合,这
些内容都没办法满足。然后,碰到了erlang,忘了是在哪个网站,反正是
在看技术相关的文章的时候看到的,我立刻就被erlang所宣称的特性吸引
了,这正是我想要的一个底层平台,我所要的就是一个这样支持我瞎折腾
的平台。

其次,学习并没有想象中的难,大约用了1周的时间,学习完erlang的
内容(Programming Erlang,当时还没有中文),然后开始设计一个基本的
模型,然后再设计,设计,直到我稍微满意。从顺手程度而言,要比lisp
顺手的多,我当初使用C/C++设计的时候,是有考虑过lisp的,我用的是
emacs,所以多多少少要会些lisp,但一看到lisp中别人写的库,我就感到
崩溃,没有匹配高亮我真的不知道那些高手如何将那么多的括号匹配上的,
因此我也一直没好意思对别人说我也会lisp的,扯远了些,总之,相比
lisp,erlang更适合我的学习。

在几十次的试验之后,包括基于yaws,mochiweb的页游,最后总算有了
自己的想法,熟悉了使用erlang思考问题的方式,开始设计一个一个的模
块结构。

因此,erlang就是被我用来瞎折腾的,用来验证我的设计思路以及想法
的,我也因此不断的思考如何用erlang来快速设计想要的内容,而erlang
方面,第三方库也越来越多,相比使用C/C++,验证这些内容,都要进行大
量的编码。下面列出部分使用erlang做的试验:

页游: 使用yaws和mochiweb都设计过,yaws的好处就是可以把erlang
当成php用,mochiweb呢,就一个web框架,想做什么随你,问题是我对网
页前端的设计不熟,所以就随便试试,主要关注在大量用户的情况下,
浏览器在进行http连接服务器的时候,服务器如何区分各个独立的用户以
及这些用户的行为。

股票数据抓取: 这个就无聊了,当时就想看看新浪股票的数据能不能
用erlang来分析,同时想看下如果发送很频繁的时候数据是不是实时变化
的,总之,结果忘了。

电话号码抓取: 前些年我用android手机的时候,拨长途使用IP拨号便
宜,但试了几个软件都不理想,我只想要一个IP拨号功能就行了,顶多加
上归属地,但软件总有一些其他的,比如广告,比如个头太大,比如总是
更新,烦啊,就在股票数据抓取的基础上,写了个电话号码的抓取,还专
门写了个10多K的ip拨号的android软件,专门定制了android手机系统,
不过,最后这套内容不知道在哪个硬盘中,总之没有找到了。当时抓取是
从几个网站上同时抓取的,有些有时间限制,有些会出现不同的干扰信息,
如果用C/C++来做这些处理的话,每次都要中断下,使用erlang就方便多了,
出现错误的时候,直接改,改到正确为止,不同的网站有不同的限制,因
此,我设计了好几种模式,如果发现了时间限制,则切换代理,如果一个
网站可以快速抓取的话,在自己分配的数据完成之后,再自动对所有任务
分配,总之,不死不休。

网络负载测试: 测试erlang在不同连接数之下的内存占用量,当时,
有一个现成的C++服务器以及mysql数据库,也头一次看到了erlang的NIF,
就想试试NIF内容,然后就用了几个小时做了个小设计,erlang做网络连接
的前段,原来的C++代码通过NIF做数据处理的后端,同时连接数据库。我
通过一台笔记本,连接到erlang服务器,总之,笔记本当初在启动到12K的
连接的时候,再也开动不了新的了。反观服务器,超轻松,反正玩的目的
达到了,也不追求极限,够用即可。

网游服务器: 这个设计过好多个版本,有些是测试看是否可以设计的,
有些是做教学用途的,有些纯粹是看着别人的好玩,模仿用途的,
总之,杂七杂八一大堆,当然,还有一个因素是这样就不用去学mysql了。

网络爬虫: 写了个优酷的网络爬虫,结果爬了优酷的几百万个网页之
后,虚拟机内存小,爬不动了,开了就说内存不足gameover了,虽然可以
改成磁盘也可以,不过,反正这些数据对我没有太大用途,爬了也没用,
只是验证下使用erlang设计更方便还是python更方便, 而且,对于这种大
网站,有些页面可能会出现一些不一致的内容,不过,在后来的bilibili
的网站上,发现了更多的不一致,觉得还是优酷的规范些,但一旦出现了
一些问题,总可以不用关闭直接修改,然后就解决问题了,从这一点上而
言,我觉得比python要好些,而且,对于抓取的内容格式什么的进行后期
处理,不满意也可以随时修改。

webshell: 偶然想法,通过web来管理所有的基于erlang的内容,结果
发现已经有人弄了,拿过来一用,总之,在不同的方式上有些问题,比如
本地什么的就没有问题,通过nginx中转,端口映射什么的就没办法,修修
改改,结果直接在服务器上使用了。

smtp发邮件: 服务器出现了异常怎么也得发封邮件吧,结果试试,没
问题,可以做到。

bitcon服务器: 这个是突然的一个想法,觉得erlang社区现在发展的
也还不错,结果果然有这方面的内容,结果,可怜的树莓Pi编译了一个晚
上才将bitcon的代码编译完,算了,不折腾树莓Pi了。

以上只是部分使用erlang折腾的而且可以公开讨论的内容, 其他一些相
关的就没办法说了。总之,erlang就是供我瞎折腾的。

发布者

rix

如果连自己都不爱自己,哪还有谁来爱你