算起来接触erlang 三个多月快四个月来,期间从零开始看书写erlang代码、修改RabbitMQ、业务开发、系统调优,总算是有点入门了。

  最难受的是边学边修改RabbitMQ,开始真心的看不懂,不知道为啥要这么写,死扛才看过去,想想真心不容易,最后提交修改2000+行代码。

  说到坑,那就是erlang 设计与一般语言很大不同,虽然简单但还是有不少需要注意点,不熟悉造成的;erlang 是一门非常成熟语言,OTP 也特别稳定,不过要想用好,很不简单。

  列举遇到的注意点:

  1. 学习资料少

  书:《programing erlang》erlang 作者写的,通俗简单 嗯 真的很简单。。看一遍就够写得都差不多

  官方文档: 不够详细?凑合看吧,好歹有

  博客推荐:(建议有空将他们博客通读一遍,可以少踩很多坑)

  http://www.cnblogs.com/zhengsyao/ (强推,写得很详细)

  http://blog.yufeng.info/

  http://www.cnblogs.com/me-sa/

  http://wqtn22.iteye.com/  

  2. error_logger

  这是个坑货, 而且默认crashlog 用这玩意儿记,一旦进程批量crash,因为内部receive-match 写磁盘方式,越来越慢。

  可以选用lager,不过lager 在message_queue_len 超过指定值(50)后采用同步方式,内部依然是receive-match 写磁盘 方式写磁盘,

  建议实现自己的lager_backend,通过cast 到独立 gen_server2 写磁盘,或者cast 到网络写到日志服务器上去

  3. gen_server receive-match 问题

  避免在热点gen_server 中使用receive-match 方式,或者都使用如rabbitmq 中的gen_server2,一定要防止在message_queue_len可能

  比较大的进程中做recieve-match,error_logger就存在这个问题。

  4.  热点进程

  erlang 是公平调度,热点进程在负载稍高时,就会没机会得到处理,注意设置priority high

  

  5. 单进程处理瓶颈

  erlang 中因为进程无法共享数据,往往使用单个gen_server 完成共享逻辑,但erlang CPU计算是很低效的,往往但进程无法完成业务处理。

  这个时候需要拆分到多个进程处理,如:server_1, server_2 .... 。

  6. ETS

  4、5 另一个解决方案是使用ETS,ETS 可以作为全局表,所有进程都可以读写,不存在热点进程,而且减少了进程消息交互成本,效率要高很多。

  但是,ETS 是表结构,能够适合的场景很少,能用那就尽量多使用吧。

7. rpc:call

成本较大:一次调用有3次网络往返

   服务端单进程:服务端有rex 进程处理,容易产生瓶颈,测试最多处理 10w/s 消息

  如有必要尽量多使用 Pid ! Msg - receive 方式

  8.  gen_server:call timeout

  timeout 是给call 方返还的,而实际处理一定会被处理,而且reply 也会在timeout 后发回message_queue,要注意。。

  9.  Pid ! Msg

  Pid 不存在时,消息丢失, gen_cast 也一样;就算is_process_alive 判断也会存在竞态,所有是无法判断是否send sucess ,只能reply 确认

  10. 依赖supervisor

  erlang 设计模式,一般不怎么处理异常,非常态错误依赖supervisor 重启。 但如果gen_server 存在数据,重启瞬间 就会丢失数据。

总结初用erlang 时的遇到一些问题的更多相关文章

  1. 安装RabbitMQ编译erlang时,checking for c compiler default output file name... configure:error:C compiler cannot create executables See 'config.log' for more details.

    checking for c compiler default output file name... configure:error:C compiler cannot create executa ...

  2. [Erlang 0124] Erlang Unicode 两三事 - 补遗

    最近看了Erlang User Conference 2013上patrik分享的BRING UNICODE TO ERLANG!视频,这个分享很好的梳理了Erlang Unicode相关的问题,基本 ...

  3. Erlang环境用eclipse搭建

    erlide插件eclipse开发erlang   一.相关资料 Erlang 的官方网站是http://www.erlang.org.其左侧的连接指出了我们可以从这里获取的资源. 其中, Downl ...

  4. erlang note

    没有关于erlang interface ,继续寻找吧... --------------------------------------------------------------- erl - ...

  5. 复习做UWP时涉及到的几种加密签名相关

    本人菜鸟一枚,大学里凭兴趣学了一点WP的皮毛,后来又幸运(或者不幸)的进了一家专注于Windows生态的公司做了一段时间的UWP.在博客园写点自己遇到的东西,作为分享,也作为自己的备忘,如果有错误的地 ...

  6. Erlang库 -- 有意思的库汇总

    抄自这里 首先,库存在的目的大致可分为:1.提供便利2.尽可能解决一些痛点 首先,我们先明确一下Erlang编程语言的一些痛点(伪痛点):1,单进程问题Erlang虚拟机属于抢占式调度,抢占式调度有很 ...

  7. Tsung脚本中使用动态参数(一)---直接在脚本里编写Erlang代码

    杀死一个程序猿,只要改三次需求.同理,杀死一个接口自动化测试人员,只要改三次接口数据处理方式.我目前的状态,改了一次接口数据处理方式,有一种胸闷的感觉. 因为改需求,所以,要改脚本.T_T.所以,才有 ...

  8. Erlang/OTP设计原则(文档翻译)

    http://erlang.org/doc/design_principles/des_princ.html 图和代码皆源自以上链接中Erlang官方文档,翻译时的版本为20.1. 这个设计原则,其实 ...

  9. 《erlang程序设计》学习笔记-第3章 分布式编程

    http://blog.csdn.net/karl_max/article/details/3985382 1. erlang分布式编程的基本模型 (1) 分布式erlang:这种模型可以让我们在一个 ...

随机推荐

  1. FCM聚类算法介绍

    FCM算法是一种基于划分的聚类算法,它的思想就是使得被划分到同一簇的对象之间相似度最大,而不同簇之间的相似度最小.模糊C均值算法是普通C均值算法的改进,普通C均值算法对于数据的划分是硬性的,而FCM则 ...

  2. 更新过程 renewal process

    一类随机过程.是描述元件或设备更新现象的一类随机过程.设对某元件的工作进行观测.假定元件的使用寿命是一随机变量,当元件发生故障时就进行修理或换上新的同类元件,而且元件的更新是即时的(修理或更换元件所需 ...

  3. 一个简单oop的changeTab

    好多地方都会用到这样一个效果“点击tab切换内容页”,根据自己的想法实现了一下,写了个简单的插件.以前写代码都是标准的函数式编程,现在觉得面向对象编程看起来比较爽,并且更容易维护,于是就用oop的思想 ...

  4. xamarin.forms新建项目android编译错误

    vs2015 update3 新建的xamarin.forms项目中的android项目编译错误.提示缺少android_m2repository_r22.zip,96659D653BDE0FAEDB ...

  5. JS:window.onload的使用

    1.最简单的调用方式 直接写到html的body标签里面,如: (html) (body onload="func()") (/body) (/html) 2.在JS语句调用 (s ...

  6. git的基本介绍和使用

    前言:从事iOS开发一年多以来,一直使用svn管理源代码.对svn的特点和弊端已经深有体会.前些天双十二前后,项目工期紧张到爆,起早贪黑的加班,可谓披星戴月,这还不止,回到家中还要疯狂的敲代码.那么问 ...

  7. DevExpress.chartControt画趋势图

    private void DrawLine(DataTable dt) { Myalysis.Series.Clear(); //图标位置 Myalysis.Legend.AlignmentHoriz ...

  8. angular路由——ui.route

    angular路由 使用案例 <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...

  9. Boost.Python简介

    Boost.Python简单概括:是Boost库的一部分:用来在C++代码中调用python代码以及在Python代码中调用C++代码,并且避免用户直接操作指针. 以下内容搬运自:https://wi ...

  10. RabbitMQ 集群+负载均衡

    负载均衡 集群的配置已经搭建好了,代码也成功跑通,成功做到了高可用,但是我们的程序连接节点并不会管哪个服务器在忙.哪个服务器空闲,完全看心情想连谁就连谁.而且代码中要把每个ip的节点都手动的写出来 , ...