Erlang “你们都用 erlang 做什么?” 和 “随便聊聊用这两个语言在工作中的事”

wudixiaotie · 2015年08月26日 · 最后由 linus 回复于 2015年09月05日 · 3458 次阅读

好想问,为什么ruby的社区要建erlang的节点?在这里待着的人,有真正从事erlang工作的呢,还是工作做ruby,只是喜欢erlang,想学学这个coolcool的东西? 我最开始是个ruby程序员,后来自学的erlang,现在找到了个erlang的工作在做(IM方面)。 我很奇怪国内连个erlang的根据地都没有,大家交流也是在几个erlang大牛的博客中留言而已,以前也有erlang的社区网站不过不知道为什么早早就不维护了。 说起来国内的erlang大牛肯定是有很多啊,不过愿意出来写博客分享的有两个:淘宝的褚霸还有网名叫坚强2002的一个哥们。 基本上他们会分享出自己工作中遇到过的一些问题和解决办法,还有erlang的细节和虚拟机内部机制。尤其是后两点,对于了解erlang太重要了,因为如果这些东西不知道的话,你很难写出高并发的程序,你会发现,怎么我的代码这么好的服务器就几十万的并发就cpu90%了?内存也快满了。。erlang也没比java牛逼多少啊!!! 唉,真真让我怎么说这些同学呢,其实根源是有些东西不是随便写写就OK的。 做erlang和以前做ruby最大的不同在于,做ruby的时候我写代码,写完做测试开个irb或者rails c验证一下代码确实能运行并得到我想要的结果,这意味着我这次的工作完成了,git add commit merge push。over。 做erlang的时候呢?每个功能我做之前就要想好多方案,这些方案都能实现这个功能,然后我要做测试,测试有2种,1种要保证这个方案确实能得出我要的结果,第2种就是做性能测试,确保哪个方案是性能最优的。然后才实际编写功能,最后大家一起审查我的代码,没问题了才上传,还要在测试服务器上做压力测试等等,才会上线。 例如我们做消息回执的时候,给客户端发消息,消息会存缓存,等收到客户端的回执的时候,删除缓存,一定时间没收到回执,则存离线。 有3种方式存缓存,1.mnesia write。2.mnesia dirty_write. 3.ets. 最终我们选择了ets。因为首先mnesia write的时候是走事物的,他要保证所有节点之间数据同步之后才算执行完成,无形当中产生了瓶颈。mnesia dirty_write效率很高,但是由于这个回执不需要跨节点,所以也没采用,最后我们用了ets,读写速度非常快。基本能满足我们的需求。 看到这有些同学可能要说,3个方案能差多少呢,有时候单进程差距很小,结果在大并发下差距会非常大,当时做测试的数据我忘了,不过在十几万的并发下mnesia write的消息全部堆积在了接收其他节点的同步回执上。效率慢的根本无法忍受。 在整个系统过百万的并发下,多小的性能差异都会放大到很难想想的地步。就拿最简单的消息分发来说,我做过测试,一个进程负责接收消息,然后公平的分派给其他的worker进程,逻辑不复杂,但是如果这个分发进程用gen_server在10万的并发下会出现消息堆积的情况,也就是说超出了他的处理能力,只会越来越慢。如果直接receive则撑10W的并发不成问题。所以很多地方需要放gen_server就放弃吧。连mnesia的接收同步请求的进程也是直接receive的(mnesia_tm)。 扯着扯着就扯远了。希望erlang能有大牛带着大家成立个社区,像ruby社区这样活跃。 这是我在某个下午干完工作,产生的无聊的思绪,不知道为什么就写到这了。:)

共收到 10 条回复

有没有入门教程什么的,发出来普及一下。

我还在等 21 天 erlang 系列 @bhuztez

Elixir

做erlang和以前做ruby最大的不同在于,做ruby的时候我写代码,写完做测试开个irb或者rails c验证一下代码确实能运行并得到我想要的结果,这意味着我这次的工作完成了,git add commit merge push。over。

做erlang的时候呢?每个功能我做之前就要想好多方案,这些方案都能实现这个功能,然后我要做测试,测试有2种,1种要保证这个方案确实能得出我要的结果,第2种就是做性能测试,确保哪个方案是性能最优的。然后才实际编写功能,最后大家一起审查我的代码,没问题了才上传,还要在测试服务器上做压力测试等等,才会上线。

这是病得治 ...

社区还是需要用户量做基础的,用户量差太多的话做起来一个社区也没什么意思,冷冷清清的

支持。我个人也比较喜欢erlang

这个图还是发在这安全点啊

@blacktulip 是这个一个理

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册