总结初用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:这种模型可以让我们在一个 ...
随机推荐
- .NET跨平台之旅:基于.NET Core改写EnyimMemcached,实现Linux上访问memcached缓存
注:支持 .NET Core 的 memcached 客户端 EnyimMemcachedCore 的 NuGet 包下载地址:https://www.nuget.org/packages/Enyim ...
- 修改Linux用户的UID、GID
对于NFS共享文件,保留文件权限,需要UID.GID与nfs-server端一致! 试验环境:Centos6.5_64/172.24.0.26 01.用户的UID和GID不能被占用 [root@26 ...
- 走格子 51nod
球最少需要的能量,就是保证能量一直>=0,从头遍历取过程中能量最小值,绝对值为答案. #include<iostream> #include<algorithm> #in ...
- AngularJs的$http发送POST请求,php无法接收Post的数据解决方案
最近在使用AngularJs+Php开发中遇到php后台无法接收到来自AngularJs的数据,在网上也有许多解决方法,却都点到即止.多番摸索后记录下解决方法:tips:当前使用的AngularJ ...
- 实用篇!Asp.Net数据传输压缩
一.业务场景 公司关键业务模块之一考试系统试卷内容加载缓慢.加载失败,前方人员哀声四起,客户投诉,各种爆炸! 二.问题分析 1.试卷存储采用文本文件方式存储 引发问题:并发情况下IO频繁,造成过多的线 ...
- 查看Mysql版本号 (最简单的是status )
一.使用命令行模式进入mysql会看到最开始的提示符;二.命令行中使用status可以看到;三.使用系统函数等等, 查看版本信息 #1使用命令行模式进入mysql会看到最开始的提示符 Your M ...
- ajax-登陆+验证码
登陆用户名和密码判断+验证码验证 省略dao层和service层 1.生成验证码的number.jsp <%@ page contentType="image/jpeg" l ...
- Java MD5机密算法的使用
MD5 是常用的加密算法,是不可逆的.既只能加密,但不能解密. package cn.com.ctsi.csdp.base.util; import java.security.MessageDige ...
- react 犯错
1. import a from './xx' 一定要有 ./ 2. export default const x={} 错 改为 const x={}; export default x; 也 ...
- log4net位置与使用方法
<log4net> <appender name="RollingLogFileAppender" type="log4net.Appender.Rol ...