
erlang技术与应用
文章平均质量分 79
集中探讨erlang技术相关内容,深入了解erlang及Mnesia
没有开花的树
这个作者很懒,什么都没留下…
展开
-
erlang 中文编码显示乱码问题
许久没做erlang开发了,最近有网友问到erlang的问题,就抽时间看下。问题是这样的,模块有中文,将中文直接打印出来,shell下显示会出现乱码,但如果先将中文转成binary,就可以正常显示出来。文章以例子做分析,解释 io:format/2对中文的处理,然后讨论乱码出现的原因,以及latin1为何能表示中文,utf8保存的代码在shell下显示乱码问题原创 2016-02-28 23:51:15 · 8543 阅读 · 0 评论 -
erlang进程监控的实现原理
Erlang支持Monitor和Link两种监控进程的方式,使得所有进程可以连成一个整体。当某个进程出错退出时,监控进程会收到该进程退出的消息通知。有了这些特点,使用Erlang建立一个简单,并且健壮的系统就不是什么难事。前面有文章分析了两种方式的用法,这里分析下monitor和link的实现。原创 2015-07-20 20:10:32 · 3518 阅读 · 0 评论 -
erlang集群IP及端口管理
erlang集群是依靠epmd维护的,epmd是erlang集群节点间端口映射的守护进程,负责维护集群内的节点连接,提供节点名称到IP地址及端口的解析服务。默认情况下,epmd绑定在4369端口。但是,端口固定的话,容易遭受攻击,可能导致新节点的认证失败而无法启动,或无法加入集群。文章介绍如何修改epmd端口,修改端口后节点如何启动,如何限制集群节点IP地址原创 2015-06-25 02:23:52 · 7685 阅读 · 0 评论 -
从erlang时间函数说到时间校正机制
很多人会注意到这个问题,erlang提供了2个时间函数,erlang:now() 和 os:timestamp()。用法一样,都是返回当前的时间。具体时间是从1970年1月1日零时算起,到现在经过的时间,结果为{MegaSecs, Secs, MicroSecs}。这两个函数有什么区别?而且,为什么要有 erlang:now() 函数。这就是文章想讨论的内容,从erlang时间函数说到时间校正体系。原创 2015-04-29 00:34:06 · 4439 阅读 · 23 评论 -
erlang catch的内部实现(初稿)
最近项目组有同事做了erlang内部数据(Eterm)的分享。Eterm 是Erlang Term的简写,用来表示erlang中任意类型的数据,也就是说,erlang可以用到的任意数据,都能 Eterm表示。比如常见的atom、数字、列表、元组,甚至pid,port,fun,ets表等等都用Eterm可以表示。但为什么会有一个叫catch的Eterm?相信不少人都会有这样的疑问。所以,本文就围绕着 catch 进行分析和讨论。原创 2015-03-31 01:16:10 · 3097 阅读 · 0 评论 -
使用IntelliJ IDEA开发erlang项目
最近erlang版本换到了R17,为了很好支持中文,项目所有模块文件第一行加了文件格式声明:%% coding: latin-1 。但是,erlide会识别这个语句,导致中文显示乱码,这个暂时没有选项可以解决这个问题。所以,我换了新的IDE,就是本文将要介绍的IntelliJ IDEA,这个IDE很好支持erlang,而且能支持eclipse的快捷键。原创 2015-03-10 21:47:04 · 20961 阅读 · 1 评论 -
erlang 接入远程shell控制台
erlang shell是用户与 erlang 运行时系统交互的界面程序。事实上,erlang VM的运行不依赖任何shell,只要在启动的时候添加参数detached就可以脱离终端。文章介绍erlang 4种接入远程shell的方法,作业(JCL )模式 、Remsh 模式、SSH 模式、管道(pipe)模式。原创 2015-02-16 11:02:38 · 5244 阅读 · 2 评论 -
erlang开发经验谈:防坑指南
任何语言在使用中都会遇到这样那样的问题,erlang也是。文章总结了'--' 运算,try.. catch,guard判断,random随机数,list_to_atom弊端,gen_server发消息,mnesia 2G限制,进程数量限制,ets限制,端口,匿名函数导致进程被kill等等问题,要重视一下,避免继续踩坑。原创 2015-02-12 23:25:02 · 5990 阅读 · 12 评论 -
分析erlang热更新实现机制
Joe Armstrong在描述Erlang的设计要求时,就提到了软件维护应该能在不停止系统的情况下进行。在实践中,我们也因为这种不停止服务的热更新获益良多。那么Erlang是如何做到热更新的呢?这就是本文要讨论的问题。在前面的文章也提及到erlang热更新的机制,现在继续深入剖析erlang热更新实现机制。原创 2015-02-10 01:08:22 · 8208 阅读 · 8 评论 -
erlang的学习资料和文献
最近有朋友想学习erlang,问我有什么好入门的学习资料。我也借此机会整理一下:erlang中文手册、位运算与二进制解析、二进制高效编程、异常处理详解;面对软件错误构建可靠的分布式系统、编写分布式的 Erlang 程序:陷阱和对策、硝烟中的Erlang;底层有erlang VM基于多核处理器的可伸缩性特征、erlang VM内部数据共享机制、erlang 消息传递机制等原创 2015-01-25 19:15:15 · 3431 阅读 · 1 评论 -
erlang binary数据转换的问题
erlang提供了binary_to_term,把一个二进制数据转为原始的erlang数据。但是,这个函数也有副作用。如果直接将对端传来的数据做一次 binary_to_term,就可能会导致VM crash掉。原创 2015-01-12 00:11:27 · 4838 阅读 · 4 评论 -
erlang语言实现binary_to_term
erlang提供了两个函数用于erlang数据与二进制的转换,term_to_binary 把erlang数据转成一个二进制数据,binary_to_term 则是把二进制数据转为原始的erlang数据。这两个函数都是c实现的,效率很高,可用于序列化和反序列化数据,可以被直接用来当作网络封包协议。文章主要探讨这种二进制协议数据的组织形式,以及用erlang语言实现binary_to_term原创 2015-01-09 01:29:57 · 4408 阅读 · 2 评论 -
erlang mnesia 常用使用技巧
Mnesia是一个分布式数据库管理系统,适合于电信和其它需要持续运行和具备软实时特性的Erlang应用,越来越受关注和使用,但是目前Mnesia资料却不多,很多都只有官方的用户指南。文章收集一些常用 mnesia 使用技巧原创 2014-12-23 23:12:32 · 3114 阅读 · 2 评论 -
erlang热更新的实现与原理
前面的文章有讲过erlang热更新,只是大概介绍,现在再深入一点讲erlang的模块热更新的实现和原理。erlang的热更新是模块级别的,就是一个模块一个模块更新的。热更新就是在不停止系统的情况下对运行的代码进行替换。文章主要讲erlang如何热更新,热更新的原理,以及热更新会遇到的问题及解决思路。原创 2014-11-17 00:58:47 · 5708 阅读 · 0 评论 -
erlang进程trap_exit捕获异常退出
Erlang除了提供try catch,catch等语法,还支持link和monitor两种监控进程的机制,使得所有进程可以连接起来,组成一个整体。除了这样,erlang还提供trap_exit方法让进程主动捕获异常退出消息,避免发生异常时被系统关闭。原创 2014-11-16 15:56:53 · 7362 阅读 · 1 评论 -
Erlang与C构建的节点通讯
Erlang节点通讯,主要是Erlang节点与Erlang节点之间的通讯,但Erlang同时支持erlang与java构建的节点通讯,还支持Erlang与c构建的节点通讯,前面两种方式在以前的文章都可以找到,所以这里讲Erlang与c构建的节点通讯。原创 2014-11-06 00:25:37 · 3138 阅读 · 6 评论 -
解决erlang R17无法识别中文问题
erlang更新到R17已有一段时间了,公司项目打算从旧版的erlang迁移到R17,却不料有不少的困扰,其中一个问题是中文问题。在erlang的文档中说到,erlang更新到R17后,默认编码从Latin-1换成了utf8,所以无法正确识别中文,文章主要讨论及解决这个问题。原创 2014-11-02 23:20:46 · 3884 阅读 · 5 评论 -
erlang判断模块导出函数问题
erlang本身提供一个接口,可以用来检查模块是否有导出函数,这个接口是erlang:function_exported/3,但是很多时候这个接口无法正常使用。很多模块在erlang启动时都没有加载到系统,都是在使用到的时候才加载,所以这个检查导出函数的接口可能会出现错误的结果。文章讨论这个问题的解决方案及为什么会这样的原因。原创 2014-11-01 01:27:49 · 4601 阅读 · 0 评论 -
erlang list的使用与优化建议
erlang有两种复合结构,tuple和list,两者的区别是tuple子元素的个数是固定不变的,声明后就不能改变了;而list是可变的,可以通过[H|T]来取出或插入新元素。上篇文章讲了tuple相关的内容,本篇就讲erlang list方面的知识,主要说一些基本操作和常用的list函数,再讲一些可以优化的点。原创 2014-10-24 19:16:20 · 8852 阅读 · 0 评论 -
erlang节点通讯例子及问题分析
分布式是erlang的三大特性之一,都说erlang分布式,最简单最直接的应用就是节点通讯。问题来了,怎么节点通讯,节点连接可能很多人知道,如何在两个节点连接后进行本地与远程通信?这就是本篇所讲的内容。文章以例子说明erlang如何进行节点通讯,以及总结一些erlang节点无法连接的问题。原创 2014-10-22 18:53:08 · 5395 阅读 · 6 评论 -
Centos6.5安装erlang过程及问题总结
今天在Centos6.5下安装erlang,过程真是一波三折,总结一下。文章以erlang R16B03为例作说明如何在Centos下安装erlang,以及遇到一些问题如何解决,比如C compiler 依赖,crypto:start()异常,jinterface,odbc的使用。原创 2014-09-24 19:03:45 · 12779 阅读 · 2 评论 -
erlang与java构建的节点通讯
我们知道,erlang开源社区的活跃度远远不及java社区,为了让erlang和java社区的众多开源框架相结合,让他们优势互补,可以让erlang来调用java写的中间件。erlang提供了一个Jinterface代码包,java可以和erlang建立节点通信。通过这种方式,erlang可以将 java构建的节点也当作erlang的一个节点,java可以接收erlang传过来的消息,并且处理之后以异步的方式发送处理结果。文章介绍java如何建erlang节点与erlang通讯,以及讨论无法连接的情况及解决原创 2014-08-10 14:27:16 · 3821 阅读 · 3 评论 -
Erlang提高ETS并发读写性能
ETS是Erlang内置的内存数据库,可用于多进程共享数据,具有并发读写的性能,文章就这点展开探讨,重点说说ets并发读写两个参数的优缺点及适用场合。原创 2014-07-26 23:26:22 · 6646 阅读 · 8 评论 -
erlang shell表格数据对齐
最近在erlang shell做一些测试,为了让测试结果数据显得更直观,想对齐需要打印的数据,做成像表格一样的效果。开始的想法是在数据中插入tab。当然,erlang也有对tab的支持,但实际效果不理想。文章介绍一种自定义字符个数的方法。原创 2014-07-20 14:25:17 · 2248 阅读 · 0 评论 -
简单谈谈Erlang的几种运算符
Erlang 有好几种运算符,比较运算符、数学运算符、布尔运算符,文章针对这几种运算符做讨论,参考erlang文档,以例子说明。原创 2014-07-15 13:20:41 · 22777 阅读 · 0 评论 -
mnesia如何修改表结构
mnesia创建的时候需要指定表record结构,如果定义的record结构修改了,就要更新数据的表结构,否则mnesia无法正常读取和写入数据。文章介绍如何修改mnesia的表结构原创 2014-06-30 23:47:03 · 2943 阅读 · 0 评论 -
说说erlang tuple和record结构
erlang有两种复合结构,tuple和list,两者的区别是tuple子元素的个数是固定不变的,声明后就不能改变了;而list是可变的,可以通过[H|T]来取出或插入新元素。record有点像C/C++里面的结构体,实际上是语法糖,方便我们的开发,代码汇编时转成tuple表达形式。文章将分别以例子及汇编代码说明erlang tuple和record结构原创 2014-06-16 23:19:36 · 5862 阅读 · 7 评论 -
erlang二进制数据垃圾回收机制
erlang二进制数据在内存中有两种存在形式,当数据大小不到 64 bytes,就直接存在进程堆内,如果超过了64 bytes,就被保存到进程外的共享堆里,可以给节点内所有进程共享。结合上篇谈到的Erlang进程堆垃圾回收机制,这里再谈谈erlang二进制数据的垃圾回收机制原创 2014-06-10 01:01:57 · 3806 阅读 · 5 评论 -
分析和解决mnesia过载问题
mnesia在频繁写数据的过程可能会报错:** WARNING ** Mnesia is overloaded: {dump_log, write_threshold},可以看出,mnesia应该是过载了。这个警告在mnesia dump操作会发生这个问题,表类型为disc_only_copies 、disc_copies都可能会发生。文章将分析mnesia过载的原因,同时从mnesia dump数据角度来剖析这个问题,最后总结解决mnesia过载的方法和存在问题原创 2014-06-06 22:53:50 · 5672 阅读 · 0 评论 -
Erlang热部署 - 心跳机制(heart)
我们写的程序不可能都没有bug,特别是项目越做越大,代码越来越多的时候,系统出错导致崩溃的可能性越来越大。而很多时候引发系统崩溃的来源可能不是致命性的,比如程序长时间运行,操作系统资源调度问题,或者是偶然的系统突发问题等等。那么,如何防止erlang猝死导致服务的长时间中断,erlang也给了我们答案:erlang心跳机制。文章将从erlang心跳机制、心跳原理、心跳参数、心跳函数几个方面来讲述。原创 2014-01-15 19:56:55 · 5046 阅读 · 0 评论 -
Erlang进程堆垃圾回收机制
每个Erlang进程创建之后都会有自己的PCB,栈,私有堆。erlang不知道他创建的进程会用到哪种场合下,所以一开始分配比较小。如果分配的空间不够了,erlang gc会动态调整堆大小以满足需求,如果分配的空间大了,就会回收内存。文章主要讲述Erlang进程堆垃圾回收机制,以及如何利用erlang gc机制对系统做一些优化原创 2014-05-23 00:17:52 · 11006 阅读 · 11 评论 -
erlang如何有效监听大量并发连接
看了erlang的一些开源网络框架RabbitMQ、Ranch,他们都使用多个进程同时accept一个socket。这种方式在使得socket端口监听的工作分担了更多的调度机会,但是,在erlang中,socket接受一个新连接后,如果想让另一个进程处理消息,就要显式的调用gen_tcp:controlling_process(Socket, Pid)。所以问题来了,erlang多个进程同时监听一个socket安全吗?文章将会重点讨论这个问题及对这个问题做优化。原创 2014-05-29 22:58:26 · 4051 阅读 · 0 评论 -
erlang R17新socket选项{active,N}
erlang R17带来了新的socket选项{active,N} ,与{active,once}一起为应用层提供流量控制。为什么会多了这个选项,{active,once}不是可以有效抑制大量socket消息吗?我们知道,{active,once}在每次接收到包都要重新设置active选项,才能继续接收erlang的消息通知。实际上,每次设定{active,once}都意味着调用一次epoll_ctl, 如果请求过于频繁,就会有大量的epoll_ctl调用。erlang目前只有一个线程会收割epoll_wa原创 2014-05-11 22:37:52 · 4581 阅读 · 8 评论 -
erlang在windows下和虚拟机节点通信
在Linux下部署erlang项目,开发过程很多都是在Windows完成的,然后再发布到Linux,所以测试过程要在虚拟机下完成。有一天因为想要在虚拟机中使用到erlang图形化工具,比如appmon、tv、observer等等,便突发奇想得利用Windows的erlang连接到虚拟机中使用这些工具,用以查看虚拟机的运行状态。原创 2014-05-11 23:59:27 · 3838 阅读 · 3 评论 -
erlang mnesia 数据库备份与还原
数据库在使用当中都会有数据库备份工作,当数据库发生严重错误无法启动,或者数据丢失时可以及时有效地恢复数据。文章首先介绍如何备份和还原Erlang Mnesia数据库,然后从备份、回滚两大方面深入探讨mnesia的备份机制。原创 2013-12-21 10:35:09 · 4494 阅读 · 0 评论 -
erlang mnesia数据库设置主键自增
Mnesia是erlang/otp自带的分布式数据库管理系统。mnesia配合erlang的实现近乎理想,但在实际使用当中差强人意,总会有一些不足。mnesia数据表没有主键自增的功能,但在mnesia函数中有一个自增函数可以用来生成自增的id,文章将讲述如何实现主键自增的功能。原创 2013-12-04 19:02:52 · 3233 阅读 · 0 评论 -
总结Erlang的系统限制
Erlang本身对进程数,原子长度等没有限制,但为了提高性能和节省内存,总会在实际实现中和运行环境中作出一些限制。文章从erlang进程数量,分布式节点数量,atom的最大数量,端口数量限制,socket数量限制,等等分别做说明。原创 2014-01-01 11:30:15 · 7457 阅读 · 1 评论 -
Windows下使用NIF扩展Erlang方法
在Erlang中,NIF(Native Implemented Function)被用来扩展erlang的某些功能,一般用来实现一些erlang很难实现的,或者一些erlang实现效率不高的功能。NIF使用C开发,效率和C接近,比纯erlang实现要高。NIF会编译成动态库,直接动态加载到erlang进程空间调用,也是erlang扩展新方法最高效的做法。原创 2014-01-02 19:48:41 · 5284 阅读 · 17 评论 -
Erlang 整数与浮点数转换、进制转换
Erlang 整数与浮点数的转换、数字之间的进制转换,浮点数改变精度等等这些功能,Erlang BIF(Erlang内建函数)已经帮我们很好实现,调用他们也很方便,文章将简单说明如何去使用他们。原创 2014-01-03 21:46:12 · 5908 阅读 · 0 评论 -
erlang 解决socket 数据粘包问题
我们知道,erlang实现的网络服务器性能非常高。erlang的高效不在于短短几行代码就能写出一个服务端程序,而在于不用太多代码,也能够写出一个高效的服务端程序。而这一切的背后就是erlang对很多网络操作实现了近乎完美的封装,使得我们受益其中。文章将讨论erlang gen_tcp 数据连包问题及erlang的解决方案。原创 2014-02-13 21:05:29 · 7578 阅读 · 2 评论