抄自http://veniceweb.googlecode.com/svn/trunk/public/daily_tech_doc/erlang_global_20091109.txt

1. 介绍:
这个全局服务是通过一个global_name_server的process来提供的,这个进程存在于每一个erlang node, 这个全局名字
服务在每个节点启动的时候自动启动.

这个模块在所有的链接的erlang节点的集群中实现了register_name/2和whereis_name/1的功能.一个注册名是一个pid的别名,
这个名字服务进程管理这些注册的pid,如果一个process终止,名字将自动被注销unregistered.

这些注册名储存在name table中,这个name table在每一个节点上都存在,因此名字服务的调用是快速的,当一个操作改变了
name table, 所有的节点的name table都会自动被更新.

2. 单个节点的例子:

-module(test).
-export([start/, rpc_call/, handle_msg/]). start(Name) ->
Pid = spawn(?MODULE, handle_msg, [Name]),
register(Name, Pid). %% 在本地node注册process的名字 rpc_call(Name, Msg) ->
Name ! {Msg, self()}, %% 向本地node的process发消息
receive
{Reply, Name} ->
Reply
end. handle_msg(Name) ->
receive
{stop, Pid} ->
Pid ! {stop, Name};
{Msg, Pid} ->
Pid ! {"received your msg: " ++ Msg, Name},
handle_msg(Name)
end.

测试:
  

测试:

测试:
启动一个本地的process, 并注册一个名字pid1, 调用whereis/1测试,返回Pid,
测试通过名字pid1对进程发消息,
之后停止process, 再次调用whereis/1测试,返回undefined
test:start(pid1).
true
whereis(pid1).
<0.64.>
test:rpc_call(pid1, "test - 1").
"received your msg: test - 1"
test:rpc_call(pid1, "test - 2").
"received your msg: test - 2"
test:rpc_call(pid1, stop).
stop
whereis(pid1).
undefined

3. Erlang Nodes集群的例子:

-module(test).
-export([start/, rpc_call/, handle_msg/]). start(Name, Node) ->
Pid = spawn(Node, ?MODULE, handle_msg, [Name]),
global:register_name(Name, Pid). %% 注册global的process的名字 rpc_call(Name, Msg) ->
global:send(Name, {Msg, self()}), %% 向global的name消息发送方式
receive
{Reply, Name} ->
Reply
end. handle_msg(Name) ->
receive
{stop, Pid} ->
Pid ! {stop, Name};
{Msg, Pid} ->
Pid ! {"received your msg: " ++ Msg, Name},
handle_msg(Name)
end.

测试:
在同一台机器上启动三个节点的erlang集群:

erl -sname node1 -setcookie testcookie
erl -sname node2 -setcookie testcookie
erl -sname node3 -setcookie testcookie
在node1上启动服务:
(node1@dev-pc)> test:start(pid1, node()).
yes
(node1@dev-pc)> test:rpc_call(pid1, "msg - 1").
"received your msg: msg - 1"
在node2和node3上测试效果:
(node3@dev-pc)> test:rpc_call(pid1, "msg - 3").
"received your msg: msg - 3" (node2@dev-pc)> test:rpc_call(pid1, "msg - 2").
"received your msg: msg - 2"

4. 分布式的知识补充:

<> 如何在调用远程node上的方法?
rpc:call(Node, Mod, Func, [Arg1, ... ArgN]).
会在Node上进行一次Mod:Func(Arg1, ... ArgN)调用. 节点名的形式是: NodeName@Host, NodeName和Host都是atom(), 其实整个节点名就是一个atom(). <> 在不需要DNS的情况下使用erl -sname node1,
需要DNS的情况下使用erl -name node2 <> 设置cookie:
erl -setcookie testcookie
或者erlang:set_cookie(Node, testcookie) <> 如何保持两个node上的代码版本一致?
可以使用nl(Mod), 这个操作会使所有互联的节点上加载Mod. <> 判断节点的连通性: net_adm:ping(Node) <> node() -> Node 返回本地节点的名字
nodes() -> [Node] 返回网络上与当前节点连接的所有其它节点列表

对于global的介绍的更多相关文章

  1. Vim global命令和重复操作

    Vim global命令和重复操作 Vim global命令允许我们在某个指定模式的所有匹配行上运行可执行的 Ex 命令,缩写形式为 :g,其处理重复工作的效率极高. 一.Vim global命令介绍 ...

  2. 织梦cms常用标签

    dedecms简介:织梦内容管理系统(DedeCms) 以简单.实用.开源而闻名,是国内知名的PHP开源网站管理系统,也是使用用户较多的PHP类CMS系统,在经历多年的发展,目前的版本无论在功能,还是 ...

  3. u-boot启动流程分析(2)_板级(board)部分

    转自:http://www.wowotech.net/u-boot/boot_flow_2.html 目录: 1. 前言 2. Generic Board 3. _main 4. global dat ...

  4. 海思uboot启动流程详细分析(三)【转】

    1. 前言 书接上文(u-boot启动流程分析(二)_平台相关部分),本文介绍u-boot启动流程中和具体版型(board)有关的部分,也即board_init_f/board_init_r所代表的. ...

  5. postgresql常见命令及操作

    pgsql已经更新到beta11了,不同版本的服务器启动或相关命令.配置可能会有不同,所以得根据pg版本进行操作.下面记录一些工作中常用到的一些操作,主要包括服务启动.备份/恢复数据.数据目录迁移.常 ...

  6. PostgreSQL 数据目录结构

    根目录介绍 data ├── base # use to store database file(SELECT oid, datname FROM pg_database;) ├── global # ...

  7. Global.asax.cs介绍

    转载  http://www.cnblogs.com/tech-bird/p/3629585.html ASP.NET的配置文件 Global.asax--全局应用程序文件 Web.config--基 ...

  8. Vue + Webpack + Vue-loader 系列教程(1)功能介绍篇

    原文地址:https://lvyongbo.gitbooks.io/vue-loader/content/ Vue-loader 是什么? vue-loader 是一个加载器,能把如下格式的 Vue ...

  9. Storm介绍(一)

    作者:Jack47 PS:如果喜欢我写的文章,欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 内容简介 本文是Storm系列之一,介绍了Storm的起源,Storm ...

随机推荐

  1. windows远程登录最大连接数

  2. 有意思的随机数 Random

    今天看到stackoverflow上一篇关于随机数的提问,关于如何用随机数生成 "hello world"的有趣问题 : 大家都知道JDK里面的Random类生成随机数其实并不是真 ...

  3. Largest Rectangle in Histogram, 求矩形图中最大的长方形面积

    问题描述: Given n non-negative integers representing the histogram's bar height where the width of each ...

  4. 画龙点睛 之RabbitMQ 初来乍到

    消息队列解决了什么问题 1. 异步处理 2. 应用解耦 3. 流量削峰 4. 日志处理...... 安装RabbitMQ (这里的安装我只仅仅说一下linux 的安装 如果想安装windows 版 可 ...

  5. localhost不能访问127.0.0.1可以访问的原因以及解决办法

    今天在调试程序的时候,出现了一个奇怪问题,localhost不能访问但127.0.0.1可以访问? localhost与127.0.0.1的概念和工作原理之不同 要比较两个东西有什么不同,首先要弄清两 ...

  6. 使用springmvc报错Required int parameter 'age' is not present

    仔细检查jsp代码 <a href="springmvc/testRequestParam?username=atguigu$age=11">Test RequestP ...

  7. dypedef 和 define

    typedef char *String_t; 和 #define String_dchar * 这两句在使用上有什么区别? 答:typedef char *String_t 定义了一个新的类型别名, ...

  8. 地图Legend控件的使用

    http://support.esrichina-bj.cn/2011/0318/1150.html

  9. Ubuntu 18.04 下 emscripten SDK 的安装

    Ubuntu 18.04 下 emscripten SDK 的安装http://kripken.github.io/emscripten-site/docs/getting_started/downl ...

  10. sizeof结构体

    规则1:结构体的对折长度为其基本数据成员的长度的最大值. 规则2:指定边界情况下,结构体的对折长度为自身对折长度和指定对折长度中较小者. 规则3:当行内结构体的基本数据成员的起始地址必须为其长度的整数 ...