关于Erlang的一些知识
2019-11-26 16:45:45 阿炯
侦听在Tcp 4369端口上的epmd进程
刘欣说:是最低调的编程语言Erlang却是高并发的王者
侦听在Tcp 4369端口上的epmd进程
Epmd,是Erlang集群节点间端口映射的守护进程,负责维护集群内的节点连接,提供节点名称到IP地址及端口的解析服务。Epmd是Erlang Port Mapper Daemon的缩写,在Erlang集群中的作用相当于dns的作用,提供节点名称到端口的查询服务,它绑定在众所周知的4369端口上。
Erlang的节点名称是类似这样的foo@ip的格式,当一个节点启动的时候,首先会在本机启动epmd,同时把自己的节点名称和节点监听的tcp端口登记在其中。
epmd是个标准的tcp服务器,它的协议如下:
kernel的erl_epmd模块提供epmd协议的封装,向net_kernel模块提供服务。如果net_kernel要连接其他节点的时候,就取出节点名称的ip部分,通过erl_epmd建立连接到ip:4369,使用epmd协议来查询想要的foo的端口,然后再用ip:port去连接真正的服务。
新版本的epmd提供了强行移除名称的功能,避免由于erlang虚拟机由于某种原因crash,没有注销名字,导致无法再使用这个名字。要使用stop功能,epmd必须以 -relaxed_command_check 启动,具体参考epmd –help。
epmd 自定义端口号
epmd端口配置
默认情况下,epmd绑定在4369端口。但是端口固定容易遭受攻击,可能导致新节点的认证失败而无法启动或无法加入集群。
epmd -daemon -port 5000
如果想用调试模式启动 epmd,使用 epmd -d -port 5000
另外,epmd通常伴随着erlang节点启动时自动启动,无须手动处理,所以可以通过修改erl启动参数以达到自动调整epmd端口。
erl -name freeoa@127.0.0.1 -epmd "epmd -port 5000 -daemon"
节点启动配置
当epmd端口改变时,erlang节点需要显式指定epmd端口信息。在windwos下,erlang启动方式如下:
C:\>set ERL_EPMD_PORT=5000
C:\>erl -name freeoa@127.0.0.1
注意:以上命令端口号(这里是5000)前后不能留有空格。在linux下,erlang启动方式如下:
ERL_EPMD_PORT=5000 erl -name freeoa@127.0.0.1
epmd相关问题
限制指定IP的节点加入集群
epmd -port 5000 -address 127.0.0.1 -daemon
这样,如果节点名字不是 xxx@127.0.0.1,将无法启动,或加入集群。
如何杀掉epmd进程
epmd独立于erlang节点,在所有节点关闭后还会继续存在,有时候可能需要杀掉epmd进程。
epmd -kill
epmd文档:http://www.erlang.org/doc/man/epmd.html
epmd协议:http://www.erlang.org/doc/apps/erts/erl_dist_protocol.html
刘欣说:是最低调的编程语言Erlang却是高并发的王者
1998年,爱立信推出了一款著名的交换机AXD301,这款交换机实现了惊人的9个9(99.9999999%)的可用性。一般的系统实现5个9,即一年停机5分钟已经相当不错了,9个9意味着20年的运行时间内只有0.631秒的停机时间。实现这个奇迹的关键就是爱立信发明的编程语言Erlang。
Erlang的作者Joe Armstrong在采访时说道:如果Java是“一次编写,到处运行”,Erlang就是“一次编写,永远运行!”
奇怪的是,这么一个神奇的语言,爱立信竟然禁止在公司内部使用了,这是为什么呢?
1、起源
Erlang的诞生其实是个挺无奈的过程。最早的时候,爱立信只想找到一个语言,更好地构建下一代电信系统。Joe Armstrong等人拿着一个大“筛子”,把20多种语言“筛来筛去”, 标准是:
1.为了提高生产率,要选择高级的声明式语言
2.为了支持高可用的电信系统,在语言层面就得支持并发和错误恢复
第一条“筛”掉了C、PASCAL, Ada, C++等语言,第二条又筛掉了Lisp,Prolog,Parlog等语言。
没办法,只好自己发明一个新语言了,这就是Erlang。
Erlang的核心是“进程”,每个进程使用消息和其他进程进行通信,每个进程有个邮箱可以存储消息,进程通过检查邮箱的消息,然后采取行动,这其实就是现在的Actor模型。
大家也能看出来,Erlang的进程不是操作系统中常说的进程,它非常轻量级,每个进程的开销只有几百个字节,一台服务器可以轻松地支持几百万个进程同时运行。进程可以是分布式的,可以跨越网络来互相发送消息,添加服务器就可以轻松扩展。
Joe Armstrong还在Erlang中内置了“弹性”的能力,当一个进程崩溃时——不管是因为Bug还是硬件故障——都不会导致整个系统崩溃,这对电话交换系统来说非常重要。
2、艰难发展
新语言的推广是非常困难的。有爱立信员工听说了Erlang这个新语言,就在一个原型系统中尝试了一下,他们惊奇地发现,这个新玩意儿开发起系统来,比其他方案要快得多。但即使如此,Erlang依然没法大范围地在爱立信铺开使用,更别说普及到全世界了。
Joe Armstrong和团队想了很多办法进行“促销”,比如写书,召开会议,把Erlang移植到DOS、Windows、Mac、VxWorks等各种平台。
他们甚至录制了一个小电影做宣传。
1995年,Erlang终于迎来了转机。爱立信公司计划开发新一代的交换机产品,以分组交换形式进行语音、数据和各种宽带服务的通信。
但是这个项目实在太复杂了,最早用C++开发,很快就陷入了巨大的泥潭,濒临崩溃。这时候大家想到了Erlang,死马当做活马医,用它来救场吧。
Erlang不负众望,顺利帮助团队完成了交换机的开发。有意思的是,这么优秀的编程语言,爱立信竟然把它禁掉了,禁止内部使用!
原因居然是电信产品生命期长,维护一个自己专有的语言成本很高,不如采用全世界都用的编程语言!
这个禁令一出,为Erlang付出大量心血的Joe Armstrong等人大为震惊,没办法,只好游说公司开源Erlang。
1998年12月,Erlang正式开源,团队的初始成员也离开了爱立信,成立了自己的公司Bluetail,致力于Erlang的开发。
Erlang离开了电信领域,进入广阔的互联网市场。
3、大放异彩
2009年1月,雅虎前员工Jan Koum买了一部iPhone手机,他想到了一个点子:为什么不开发一个App,通过互联网来发送消息呢?
传统的方式是短信,资费高,还有流量限制,这很不爽。于是他拉来了雅虎的同事Brian Acton一起干,互联网用户的特点那就是用户数极多,并发数极高,两人经过研究,发现Erlang简直就是处理大规模消息的不二之选,后台开发就它了!
2009年1月,WhatsApp诞生。其一经推出,用户便迅猛增长,如今在全球已经拥有了20亿活跃用户。2014年,Facebook斥资190亿美元收购了一个叫做WhatsApp的软件,震惊业界。
此时的WhatsApp,已经有了4.5亿用户,并且每天以100万在增长。但让人吃惊的是,WhatsApp只有32名工程师,负责服务器后端开发的程序员只有10人。
这么惊艳的成绩,Erlang可以说是功不可没!
4、向Web进军
虽然Erlang性能卓越,但是它的函数式编程的语法却并不为大众所熟悉。
一个叫Jose Valim的巴西人觉得Erlang, OTP, Beam VM这样的好东西,广大的码农群众不能使用真是太可惜了。他是Ruby on Rails的核心开发人员,深受Ruby社区的影响。
于是大神出手,借用了Ruby简洁优雅的语法,把Erlang和OTP进行了包装,创建Elixir这门新语言。以Elixir为基础,Jose Valim等人还开发了一个新的Web框架Phoenix,方便程序员使用Elixir进行Web应用的开发。
许多创业公司使用了Elixir和Phoenix快速构建应用,尤其是高并发,实时的应用,其中最著名的是Discord。
Discord的CTO在2017年的一篇文章中说道:Discord 就是 Elixir 的早期采用者, Erlang VM 是我们想要构建的高并发实时系统的完美候选者,过去两年,系统中的并发用户数已达到近 500 万,每秒有数百万个事件...... 如果让我从头再选择一次的话,我还会选择Elixir。
5、Erlang为什么不流行?
你把Erlang吹得天花乱坠,为什么它还无法成为Java这样的主流语言呢?
有位Lisp大佬Richard P. Gabriel说得很有道理:Worse is better。
大佬说软件设计有四个目标:简单性,正确性,一致性,完整性。
在软件设计上有两大流派:MIT流派(以Common Lisp和Scheme为代表)和新泽西流派(就是贝尔实验室,以Unix和C语言为代表)。
MIT流派认为设计一定得正确,接口一定得简单,为了这两点,实现层面复杂一点也没关系。而新泽西流派则反过来,认为简单性比正确性更重要,尤其是实现的简单性比接口简单性更重要。
这带来的结果就是:Unix和C语言具备简单的结构,易于移植,运行时只需要很少的资源,虽然他们只能提供操作系统和编程语言50%~80%的功能,还是能够像病毒一样,疯狂传播。
因为Unix和C解决了痛点问题,大家可以轻松接受,并且由于实现的简单性,很容易和别的平台和软件整合,用户还会不断修改它们,完善它们。而Erlang,很抱歉,它是典型的MIT流派,这是个设计精巧、实现复杂的系统,一旦它不能满足特定需求,想在保证正确性和简单性的同时对它进行修改,非得是高人不可,这一点严重阻碍了Erlang的传播。
那Erlang真的不好吗?
不,这要看这要看谁在使用它,WhatsApp和Discord就是典型案例,在这里Erlang和Elixir发挥了极大的威力,遥遥领先竞争对手。
Paul Graham在《黑客与画家》的“拒绝平庸”这一章也说过,他用一个小众语言Lisp开发了一个电子商务的网站ViaWeb,利用Lisp强大的宏,定制出电子商务领域的DSL,让Viaweb开发速度飞快,他们不断推出新功能,让那二三十个使用C语言和Perl的竞争对手目瞪口呆。
跟随主流不会出错,但是要想迅速脱颖而出,你得采用那些有点难度的但是生产力惊人的语言,从这个意义上来说,Erlang/Elixir很可能是击败普通人的秘密武器。
本节作者刘欣,著有畅销书《码农翻身》,《半小时漫画计算机》,前IBM架构师,领导过多个企业应用架构设计和开发工作;洞察技术本质,擅长用故事去讲解复杂技术。
刘欣说:是最低调的编程语言Erlang却是高并发的王者
侦听在Tcp 4369端口上的epmd进程
Epmd,是Erlang集群节点间端口映射的守护进程,负责维护集群内的节点连接,提供节点名称到IP地址及端口的解析服务。Epmd是Erlang Port Mapper Daemon的缩写,在Erlang集群中的作用相当于dns的作用,提供节点名称到端口的查询服务,它绑定在众所周知的4369端口上。
Erlang的节点名称是类似这样的foo@ip的格式,当一个节点启动的时候,首先会在本机启动epmd,同时把自己的节点名称和节点监听的tcp端口登记在其中。
epmd是个标准的tcp服务器,它的协议如下:
kernel的erl_epmd模块提供epmd协议的封装,向net_kernel模块提供服务。如果net_kernel要连接其他节点的时候,就取出节点名称的ip部分,通过erl_epmd建立连接到ip:4369,使用epmd协议来查询想要的foo的端口,然后再用ip:port去连接真正的服务。
新版本的epmd提供了强行移除名称的功能,避免由于erlang虚拟机由于某种原因crash,没有注销名字,导致无法再使用这个名字。要使用stop功能,epmd必须以 -relaxed_command_check 启动,具体参考epmd –help。
epmd 自定义端口号
epmd端口配置
默认情况下,epmd绑定在4369端口。但是端口固定容易遭受攻击,可能导致新节点的认证失败而无法启动或无法加入集群。
epmd -daemon -port 5000
如果想用调试模式启动 epmd,使用 epmd -d -port 5000
另外,epmd通常伴随着erlang节点启动时自动启动,无须手动处理,所以可以通过修改erl启动参数以达到自动调整epmd端口。
erl -name freeoa@127.0.0.1 -epmd "epmd -port 5000 -daemon"
节点启动配置
当epmd端口改变时,erlang节点需要显式指定epmd端口信息。在windwos下,erlang启动方式如下:
C:\>set ERL_EPMD_PORT=5000
C:\>erl -name freeoa@127.0.0.1
注意:以上命令端口号(这里是5000)前后不能留有空格。在linux下,erlang启动方式如下:
ERL_EPMD_PORT=5000 erl -name freeoa@127.0.0.1
epmd相关问题
限制指定IP的节点加入集群
epmd -port 5000 -address 127.0.0.1 -daemon
这样,如果节点名字不是 xxx@127.0.0.1,将无法启动,或加入集群。
如何杀掉epmd进程
epmd独立于erlang节点,在所有节点关闭后还会继续存在,有时候可能需要杀掉epmd进程。
epmd -kill
epmd文档:http://www.erlang.org/doc/man/epmd.html
epmd协议:http://www.erlang.org/doc/apps/erts/erl_dist_protocol.html
刘欣说:是最低调的编程语言Erlang却是高并发的王者
1998年,爱立信推出了一款著名的交换机AXD301,这款交换机实现了惊人的9个9(99.9999999%)的可用性。一般的系统实现5个9,即一年停机5分钟已经相当不错了,9个9意味着20年的运行时间内只有0.631秒的停机时间。实现这个奇迹的关键就是爱立信发明的编程语言Erlang。
Erlang的作者Joe Armstrong在采访时说道:如果Java是“一次编写,到处运行”,Erlang就是“一次编写,永远运行!”
奇怪的是,这么一个神奇的语言,爱立信竟然禁止在公司内部使用了,这是为什么呢?
1、起源
Erlang的诞生其实是个挺无奈的过程。最早的时候,爱立信只想找到一个语言,更好地构建下一代电信系统。Joe Armstrong等人拿着一个大“筛子”,把20多种语言“筛来筛去”, 标准是:
1.为了提高生产率,要选择高级的声明式语言
2.为了支持高可用的电信系统,在语言层面就得支持并发和错误恢复
第一条“筛”掉了C、PASCAL, Ada, C++等语言,第二条又筛掉了Lisp,Prolog,Parlog等语言。
没办法,只好自己发明一个新语言了,这就是Erlang。
Erlang的核心是“进程”,每个进程使用消息和其他进程进行通信,每个进程有个邮箱可以存储消息,进程通过检查邮箱的消息,然后采取行动,这其实就是现在的Actor模型。
大家也能看出来,Erlang的进程不是操作系统中常说的进程,它非常轻量级,每个进程的开销只有几百个字节,一台服务器可以轻松地支持几百万个进程同时运行。进程可以是分布式的,可以跨越网络来互相发送消息,添加服务器就可以轻松扩展。
Joe Armstrong还在Erlang中内置了“弹性”的能力,当一个进程崩溃时——不管是因为Bug还是硬件故障——都不会导致整个系统崩溃,这对电话交换系统来说非常重要。
2、艰难发展
新语言的推广是非常困难的。有爱立信员工听说了Erlang这个新语言,就在一个原型系统中尝试了一下,他们惊奇地发现,这个新玩意儿开发起系统来,比其他方案要快得多。但即使如此,Erlang依然没法大范围地在爱立信铺开使用,更别说普及到全世界了。
Joe Armstrong和团队想了很多办法进行“促销”,比如写书,召开会议,把Erlang移植到DOS、Windows、Mac、VxWorks等各种平台。
他们甚至录制了一个小电影做宣传。
1995年,Erlang终于迎来了转机。爱立信公司计划开发新一代的交换机产品,以分组交换形式进行语音、数据和各种宽带服务的通信。
但是这个项目实在太复杂了,最早用C++开发,很快就陷入了巨大的泥潭,濒临崩溃。这时候大家想到了Erlang,死马当做活马医,用它来救场吧。
Erlang不负众望,顺利帮助团队完成了交换机的开发。有意思的是,这么优秀的编程语言,爱立信竟然把它禁掉了,禁止内部使用!
原因居然是电信产品生命期长,维护一个自己专有的语言成本很高,不如采用全世界都用的编程语言!
这个禁令一出,为Erlang付出大量心血的Joe Armstrong等人大为震惊,没办法,只好游说公司开源Erlang。
1998年12月,Erlang正式开源,团队的初始成员也离开了爱立信,成立了自己的公司Bluetail,致力于Erlang的开发。
Erlang离开了电信领域,进入广阔的互联网市场。
3、大放异彩
2009年1月,雅虎前员工Jan Koum买了一部iPhone手机,他想到了一个点子:为什么不开发一个App,通过互联网来发送消息呢?
传统的方式是短信,资费高,还有流量限制,这很不爽。于是他拉来了雅虎的同事Brian Acton一起干,互联网用户的特点那就是用户数极多,并发数极高,两人经过研究,发现Erlang简直就是处理大规模消息的不二之选,后台开发就它了!
2009年1月,WhatsApp诞生。其一经推出,用户便迅猛增长,如今在全球已经拥有了20亿活跃用户。2014年,Facebook斥资190亿美元收购了一个叫做WhatsApp的软件,震惊业界。
此时的WhatsApp,已经有了4.5亿用户,并且每天以100万在增长。但让人吃惊的是,WhatsApp只有32名工程师,负责服务器后端开发的程序员只有10人。
这么惊艳的成绩,Erlang可以说是功不可没!
4、向Web进军
虽然Erlang性能卓越,但是它的函数式编程的语法却并不为大众所熟悉。
一个叫Jose Valim的巴西人觉得Erlang, OTP, Beam VM这样的好东西,广大的码农群众不能使用真是太可惜了。他是Ruby on Rails的核心开发人员,深受Ruby社区的影响。
于是大神出手,借用了Ruby简洁优雅的语法,把Erlang和OTP进行了包装,创建Elixir这门新语言。以Elixir为基础,Jose Valim等人还开发了一个新的Web框架Phoenix,方便程序员使用Elixir进行Web应用的开发。
许多创业公司使用了Elixir和Phoenix快速构建应用,尤其是高并发,实时的应用,其中最著名的是Discord。
Discord的CTO在2017年的一篇文章中说道:Discord 就是 Elixir 的早期采用者, Erlang VM 是我们想要构建的高并发实时系统的完美候选者,过去两年,系统中的并发用户数已达到近 500 万,每秒有数百万个事件...... 如果让我从头再选择一次的话,我还会选择Elixir。
5、Erlang为什么不流行?
你把Erlang吹得天花乱坠,为什么它还无法成为Java这样的主流语言呢?
有位Lisp大佬Richard P. Gabriel说得很有道理:Worse is better。
大佬说软件设计有四个目标:简单性,正确性,一致性,完整性。
在软件设计上有两大流派:MIT流派(以Common Lisp和Scheme为代表)和新泽西流派(就是贝尔实验室,以Unix和C语言为代表)。
MIT流派认为设计一定得正确,接口一定得简单,为了这两点,实现层面复杂一点也没关系。而新泽西流派则反过来,认为简单性比正确性更重要,尤其是实现的简单性比接口简单性更重要。
这带来的结果就是:Unix和C语言具备简单的结构,易于移植,运行时只需要很少的资源,虽然他们只能提供操作系统和编程语言50%~80%的功能,还是能够像病毒一样,疯狂传播。
因为Unix和C解决了痛点问题,大家可以轻松接受,并且由于实现的简单性,很容易和别的平台和软件整合,用户还会不断修改它们,完善它们。而Erlang,很抱歉,它是典型的MIT流派,这是个设计精巧、实现复杂的系统,一旦它不能满足特定需求,想在保证正确性和简单性的同时对它进行修改,非得是高人不可,这一点严重阻碍了Erlang的传播。
那Erlang真的不好吗?
不,这要看这要看谁在使用它,WhatsApp和Discord就是典型案例,在这里Erlang和Elixir发挥了极大的威力,遥遥领先竞争对手。
Paul Graham在《黑客与画家》的“拒绝平庸”这一章也说过,他用一个小众语言Lisp开发了一个电子商务的网站ViaWeb,利用Lisp强大的宏,定制出电子商务领域的DSL,让Viaweb开发速度飞快,他们不断推出新功能,让那二三十个使用C语言和Perl的竞争对手目瞪口呆。
跟随主流不会出错,但是要想迅速脱颖而出,你得采用那些有点难度的但是生产力惊人的语言,从这个意义上来说,Erlang/Elixir很可能是击败普通人的秘密武器。
本节作者刘欣,著有畅销书《码农翻身》,《半小时漫画计算机》,前IBM架构师,领导过多个企业应用架构设计和开发工作;洞察技术本质,擅长用故事去讲解复杂技术。