总结初用erlang 时的遇到一些问题
算起来接触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 时的遇到一些问题的更多相关文章
- 安装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 ...
- [Erlang 0124] Erlang Unicode 两三事 - 补遗
最近看了Erlang User Conference 2013上patrik分享的BRING UNICODE TO ERLANG!视频,这个分享很好的梳理了Erlang Unicode相关的问题,基本 ...
- Erlang环境用eclipse搭建
erlide插件eclipse开发erlang 一.相关资料 Erlang 的官方网站是http://www.erlang.org.其左侧的连接指出了我们可以从这里获取的资源. 其中, Downl ...
- erlang note
没有关于erlang interface ,继续寻找吧... --------------------------------------------------------------- erl - ...
- 复习做UWP时涉及到的几种加密签名相关
本人菜鸟一枚,大学里凭兴趣学了一点WP的皮毛,后来又幸运(或者不幸)的进了一家专注于Windows生态的公司做了一段时间的UWP.在博客园写点自己遇到的东西,作为分享,也作为自己的备忘,如果有错误的地 ...
- Erlang库 -- 有意思的库汇总
抄自这里 首先,库存在的目的大致可分为:1.提供便利2.尽可能解决一些痛点 首先,我们先明确一下Erlang编程语言的一些痛点(伪痛点):1,单进程问题Erlang虚拟机属于抢占式调度,抢占式调度有很 ...
- Tsung脚本中使用动态参数(一)---直接在脚本里编写Erlang代码
杀死一个程序猿,只要改三次需求.同理,杀死一个接口自动化测试人员,只要改三次接口数据处理方式.我目前的状态,改了一次接口数据处理方式,有一种胸闷的感觉. 因为改需求,所以,要改脚本.T_T.所以,才有 ...
- Erlang/OTP设计原则(文档翻译)
http://erlang.org/doc/design_principles/des_princ.html 图和代码皆源自以上链接中Erlang官方文档,翻译时的版本为20.1. 这个设计原则,其实 ...
- 《erlang程序设计》学习笔记-第3章 分布式编程
http://blog.csdn.net/karl_max/article/details/3985382 1. erlang分布式编程的基本模型 (1) 分布式erlang:这种模型可以让我们在一个 ...
随机推荐
- Python 日常积累
包管理 >from ... import ... 的用法和直接import的区别 直接使用import时,如果需要使用到导入模块内的属性和方法,必须使用模块名.属性和模块名.方法的方式进行调用 ...
- FragmentTabHost简单保存状态的方法
private View rootView;@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container ...
- SSRF篇-本着就了解安全本质的想法,尽可能的用通俗易懂的语言去解释安全漏洞问题
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞.一般情况下,SSRF攻击的目标是从外网无法访问的内部系统.( ...
- ERwin创建逻辑模型
1.逻辑实体添加非主键属性的三种的方式 属性1:在图中直接创建 属性2:在模型导航器中创建 属性3:在属性对话框中创建 2.实体显示选项(Entity Display) Rolename/Attrib ...
- BZOJ 3158: 千钧一发
3158: 千钧一发 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1201 Solved: 446[Submit][Status][Discuss ...
- 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序
3779: 重组病毒 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 224 Solved: 95[Submit][Status][Discuss] ...
- ADO.net
五大对象: 1.Connection(连接数据库) 2.Command(执行T-SQL语句) 3.DataAdapter(用户填充DataSet,断开模式) 4.DataReader(读取数据库,一种 ...
- 2016福州大学软件工程第二次团队作业——预则立&&他山之石成绩统计
第二次团队作业--预则立&&他山之石成绩统计结果如下: T:团队成绩 P:个人贡献比 T+P:折算个人成绩,计算公式为T+T/15*团队人数*P 学号 组别 Team P T+P 03 ...
- JAVA中保留小数的多种方法
// 方式一:double f = 3.1516;BigDecimal b = new BigDecimal(f);double f1 = b.setScale(2, BigDecimal.ROUND ...
- Python_查询手机供应商
def Seach_Phone_Nmuber_operator(): CN_mobile = [134,135,136,137,138,139,150,151,152,157,158,159,182, ...