`
mryufeng
  • 浏览: 977630 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Erlang分布的核心技术浅析

阅读更多
Erlang系统在我看来有3个特性 1. 分布 2. 多核心支持 3. fp。 这这3个特性中分布我认为是erlang最强大的,从第一个版本就支持到现在,相对非常成熟,而多核心支持是这几年才加进去的。

erlang的分布系统做到了2点 1.节点的位置无关性。 2. 对用户分布式透明的。具体体现就是node是靠名字识别的, 进程也是靠pid来识别。

分布系统就要实现节点间通讯,erlang也不列外。 erlang的节点通讯介质是可以替换的 目前官方版本支持tcp, ssl通讯。

可以用 -proto_dist xxxx来选择通道。 目前支持inet_ssl inet_tcp 用户很容易模仿这这2个通讯协议,写个自己的传输通道,就是要求这个通道是可靠的,不能丢失信息。

这几个实现防火墙友好:
{inet_dist_use_interface, ip_address()}
    If the host of an Erlang node has several network interfaces, this parameter specifies which one to listen on. See inet(3) for the type definition of ip_address().
{inet_dist_listen_min, First}
    See below.
{inet_dist_listen_max, Last}
    Define the First..Last port range for the listener socket of a distributed Erlang node.

erlang的内核里面和分布相关的erl模块主要有net_kernel inet_tcp_dist inet_ssl_dist inet_tcp dist_util erlang(trap send/link等语义)。

当用户运行erl -sname xxxxx启动erlang系统的时候 kernel模块就会启动net_kernel和epmd模块。

epmd的作用是提供一个node名称到监听地址端口的映射。epmd值守在知名端口4369上.

net_kernel会启动proto_dist比如说inet_tcp_dist监听端口,同时把端口报到epmd. 这时候erts就准备好了节点通讯。

这时候另外一个节点要和我们通讯的时候,首先要连接,流程大概是这样的:
1. 根据节点名找到节点地址。
2. 查询节点的4369端口,也就是epmd,向它要节点对应的inet_tcp_dist监听的端口。
3. 发起连接, 握手,cookie认证,如果未授权就失败。
4. 记录节点名称和响应的信息。

所以节点要正常通讯要考虑到firewall和nat的影响,以及cookie正常。

具体的可以看另外一篇文章:http://mryufeng.iteye.com/blog/120666

要给节点发消息首先要保证我们和节点联系过,也就是说我们的节点表里可以查到这个节点。

net_kernel要节点的可用性, 会定期发tick消息坚持节点的可达。对端节点也会主动发送nodeup,nodeup等消息,协助维护。

net_ticktime = TickTime
    Specifies the net_kernel tick time. TickTime is given in seconds. Once every TickTime/4 second, all connected nodes are ticked (if anything else has been written to a node) and if nothing has been received from another node within the last four (4) tick times that node is considered to be down. This ensures that nodes which are not responding, for reasons such as hardware errors, are considered to be down.

节点有2种类型可见的和不可见的。erlang节点是可见的, c_interface写的节点不可见,因为c模块提供的节点能力有限。

erlang进程见通讯可以通过 1. pid  2.进程名称 来进行。 erlang系统很大的威力就在用elang实现了名称和pid的全局性维护。也就是说erlang做了个相当复杂的模块来解决名称失效 重复 查询功能。正常情况下名称是全局行的,也就是erlang的节点是全联通的,可以通过来调整。
auto_connect = Value
    Specifies when no will be automatically connected. If this parameter is not specified, a node is always automatically connected, e.g when a message is to be sent to that node. Value is one of:

    never
        Connections are never automatically connected, they must be explicitly connected. See net_kernel(3).
    once
        Connections will be established automatically, but only once per node. If a node goes down, it must thereafter be explicitly connected. See net_kernel(3).

erlang实现透明进程通信的关键点在于pid的变换:

pid {X,Y,Z} 在发到网络的时候发出去的格式是{sysname, Y, Z}
因为节点之前互相联系过 所以互相知道对方的sysname, 而且sysname在dist_entry里保存,当对端收到dec_pid的时候,用peer sysname 的查到在自己dist_entry里面的索引,然后用这个index 来构造新的pid,即 {index, Y, Z}。

erlang给一个pid发消息的时候, 首先检查Pid是本地的还是外部的, 如果是外部的,则进行上面的变换,然后通过inet_tcp_dist模块,沿着inet_tcp, inet_drv这条线发送出去。

这条消息到达对端的时候 inet_drv首先受到这条消息, 照理说应该提交给inet_tcp, 然后再到inet_tcp_dist, net_kernel来处理.但是erlang为了效率的考虑做了个折中。在inet_drv里面driver_output*中检查消息的类型 如果是dist来的消息,就给erts_net_message来处理。

这个erts_net_message处理以下几个重要消息:

#define DOP_SEND 2
#define DOP_EXIT 3
#define DOP_UNLINK 4
#define DOP_NODE_LINK 5
#define DOP_REG_SEND 6
#define DOP_GROUP_LEADER 7
#define DOP_EXIT2 8
#define DOP_SEND_TT 12
#define DOP_EXIT_TT 13
#define DOP_REG_SEND_TT 16
#define DOP_EXIT2_TT 18
#define DOP_MONITOR_P 19
#define DOP_DEMONITOR_P 20
#define DOP_MONITOR_P_EXIT 21

如果是DOP_SEND的话,就把message放到变换好的进程的队列中去。

这个核心的功能,由beam的c模块(dist.c, erl_node_tables.c, io.c )和net_kernel模块一起实现。然后在这底层的原语上进一步实现了如rpc 这样的上层模块,进一步方便了用户.

用erlsnoop http://mryufeng.iteye.com/blog/167695 可以观察到上面的通讯,有助于理解系统的运作。
分享到:
评论
14 楼 mryufeng 2009-04-18  
重新启动后PID的creation字段会不同
13 楼 yeshucheng 2008-12-17  
感觉网易的游戏底层有在用,呵呵。
12 楼 mryufeng 2008-12-10  
就我所知好多家公司用它做游戏平台
11 楼 dingjun123 2008-12-10  
肯定有,不过很少!!看过erlang好像是老家伙,后来火了,就像ajax早就有了,web2.0把它给搞火了
10 楼 javavsnet 2008-12-10  
中国有用Erlang做开发的公司么?
9 楼 mryufeng 2008-12-09  
这样的话是可能的。
8 楼 xvyu 2008-12-09  
重新看了下,那个问题是一个节点崩溃后,重新启动产生的进程id和原来相同。

这个问题的详细描述是在erlang-china提供的一篇文章《编写分布式的erlang程序:陷阱和对策》的4.1节。
7 楼 mryufeng 2008-12-09  
那不是bug,正常的,pid到另外一台机器以后会变换的,肯定不重复。X,Y,Z 中的本机X是0,区别于外来的PID.
6 楼 xvyu 2008-12-09  
erlang好像有个bug,在不同机器上的节点可能会产生有相同pid的进程。
5 楼 mryufeng 2008-12-09  
比lighty要差些。 因为erlang是opcode执行的,要比lighty的c慢, 但是架构上的优势可以补偿不少,特别是机器比较高档的话,但是版本升级,稳定度,监控和日志什么的,lighty就没有优势。
4 楼 ahuaxuan 2008-12-09  
从erlang的这3个特性看来,是不是可以说,用erlang开发一个webserver在多核的情况下性能会比较的高呢,如果用它开发一个webserver,它的性能和lighttpd比会如何(假设开发者水平相当)

在多核的机器上:
如果说erlang比lighttpd慢,那是否能说明erlang只是是在性能和速度上做出的一个平衡
如果erlang比lighttpd快,那我觉得确实erlang在多核上有优势.
3 楼 mryufeng 2008-12-09  
主要是底层关注的人比较少 但是用到的时候比较威力
2 楼 sw2wolf 2008-12-09  
多写点好啊! 这版太冷清了
1 楼 dogstar 2008-12-07  
大哥最近发威了,一口气写了这么多blog?是erlang group III的ppt内容吧?哈哈

相关推荐

    用matlab产生 erlang分布的随机数,两种方法

    Erlang分布是一种连续概率分布,常用于描述一系列独立同分布的指数随机变量之和,例如呼叫中心等待时间、服务时间等。在MATLAB中,我们可以利用不同的函数或技巧来生成服从Erlang分布的随机数。以下是两种常用的方法...

    Matlab Erlang分布随机数.zip

    在MATLAB中,Erlang分布是一种连续概率分布,它常用于表示独立同分布的泊松过程事件发生所需时间的总和。Erlang分布有多个应用,包括排队论、可靠性工程以及寿命分析等领域。本教程是针对本科和硕士级别的教研学习...

    erlang-random:生成Erlang分布随机变量

    Erlang随机变量 ... 如果未提供dims参数,则该函数从Erlang分布返回一个随机抽奖。 var out ; // Set seed random . seed = 2 ; out = random ( 5 ) ; // returns [ ~1.416, ~1.285, ~0.112, ~1.103, ~2.01

    erlang编程 Introducing Erlang

    "Introducing Erlang"是Simon St. Laurent撰写的一本入门级教程,旨在帮助初学者理解和掌握Erlang的核心概念和特性。 ### 1. 函数式编程基础 Erlang基于函数式编程范式,这意味着程序由纯函数构成,没有副作用。...

    Erlang及其应用Erlang及其应用

    1. **并发与消息传递**:Erlang的核心特性之一是并发和消息传递。在Erlang中,应用程序通常由数百或数千个轻量级进程(processes)组成。这些进程之间的上下文切换成本远低于C程序中的线程切换,使得Erlang在处理...

    Erlang公式的理解.docx

    **Erlang公式的理解** Erlang是一个在电信领域广泛使用的单位,用来衡量话务量,即通信系统中处理的呼叫流量。Erlang的名字来源于丹麦数学家Agner Krarup Erlang,他在20世纪初研究了电话交换系统的理论。在Erlang...

    erlang25.0 windows版本

    - **OTP(Open Telephony Platform)**:Erlang的核心库,包含大量预先设计的模块,用于处理常见的系统任务,如错误处理、分布式计算和监控。 - **行为模式**:如GenServer、GenEvent和Gen_fsm,它们定义了Erlang中...

    Erlang_calculator.zip_计算器

    这份报告可能包含了Erlang分布的基本概念、公式解释以及项目的技术实现细节。 “大群化效应演示.exe”这个名字不太符合Erlang计算器的主题,但有可能是与项目相关的辅助程序,用来演示或解释某些与Erlang分布或系统...

    条件Erlang分布单参数加法定理的推广 (2004年)

    在统计学和概率论中,Erlang分布是一种连续概率分布,通常用于排队理论中的服务时间分布,以及网络通信等领域。Erlang分布是伽玛分布的一个特例,当伽玛分布的形状参数为正整数时,就是Erlang分布。在给出的文件内容...

    erlang-mgf:Erlang分布矩生成函数(MGF)

    分布矩生成函数(MGF)。 随机变量的为 对于t < lambda> 0是分布的速率参数。 在t >= lambda的情况下,未定义MGF,并且此模块返回NaN 。 安装 $ npm install distributions-erlang-mgf 要在浏览器中使用,请使用...

    erlang_版本24.3.4.4

    学习Erlang时,你需要掌握以下核心概念: - **BEAM虚拟机**:Erlang的运行时系统,全称是BIFs (Built-In Functions)、Erlang、Assembler and Memory管理器。 - **OTP行为**:如Supervisor(监督者)、GenServer...

    erlang 深度分析

    Erlang分布协议(Erlang Distributed Protocol) - **概念**: Erlang节点之间通信的协议,支持跨节点的进程间通信。 - **格式**: 包含节点标识、消息类型等字段,保证了数据的安全传输。 - **实现**: 通过`net_adm`和...

    erlang资源

    4. **分布式编程**:Erlang进程可以分布在多个节点上,实现分布式系统的构建。书可能讲解了如何进行节点间通信、分布式数据管理和负载均衡。 5. **模式匹配**:Erlang的函数定义允许模式匹配,使得代码更加简洁和可...

    Erlang生态的分布式Pythonpy.zip

    py 是为 Erlang 生态系统准备的分布式 Python。该项目有两个主要特性: Python 的简单封装接口,封装了 ErlPort 调用,可方便的进行: Make module-level calls Get module-level constants Instantiate ...

    erlang9.rar

    Erlang语言的核心特点包括轻量级进程(Erlang中的进程与操作系统进程不同,它们更轻便且能快速切换)、模式匹配、函数式编程和热代码替换等。这些特性使得Erlang在处理高并发场景下表现出色,例如在电信、网络设备和...

    erlang22最新下载包

    对于开发者来说,了解这些更新和变化至关重要,因为它们可能影响到现有项目的行为,或者提供新的工具和技术来解决特定问题。学习和掌握Erlang22的新特性有助于提升开发效率和应用质量,特别是在构建高并发、分布式...

    Erlang_CNode用户指

    Erlang_CNode用户指南通常会涵盖以下几个核心主题: 1. **安装和配置**:指导用户如何在系统上安装Erlang VM和CNode所需的所有依赖项,包括设置环境变量,确保编译器和链接器正确配置。 2. **创建CNode**:详细...

    xiandiao_erlang_Erlang课后习题_

    2. **掌握并发编程**:习题可能包含创建和管理Erlang进程、实现进程间的消息传递,帮助学习者理解并发编程的核心概念。 3. **函数式编程思维**:习题可能涉及无副作用函数的编写,以及如何利用函数式编程特性如递归...

    erlang port driver test

    Port Driver 可能与其他 Erlang 外部接口技术,如 NIF(Native Implemented Function)或 ETS(Erlang Term Storage)进行了对比。 标签 "erlang post driver test" 强调了测试的焦点是关于 Erlang 的 Port Driver...

Global site tag (gtag.js) - Google Analytics