用Erlang进行分布式计算 -- 第一篇

本文我们将看看Erlang里的分布式系统是如何运作的。

Erlang是一种函数式语言,其最被大家所熟知的是分布式和并发计算。

一般Erlang程序运行在节点上(节点名默认是nonode@nohost)。

在一个分布式系统里,节点间彼此交互。本文我们将用两个节点:sakib@localhostcloud@remote-host

节点sakib@localhost运行在我本地系统,节点cloud@remote-host运行在远程服务器上。remote-host是我的远程服务器的主机名。

连接到远程节点,节点名的后缀(节点名@符号后的部分)和主机名相同是很重要。

现在如下所示打开本地系统的Erlang的shell:

1
erl -name sakib@localhost -setcookie "12345"

并且如下所示打开远程服务器的Erlang的shell:

1
erl -name cloud@remote-host -setcookie "12345"

两个节点的cookie必须一样,或者稍后你可以设置节点的cookie。如果远程节点的cookie没有设置,那么本地节点的cookie将被用来连接远程节点。

1
2
3
4
5
% 给指定的节点设置cookie
erlang:set_cookie('cloud@remote-host', '12345').
% 第一个参数是节点名,第二参数是cookie
% 连接远程节点
net_kernel:connect_node('cloud@remote-host').

如果响应是true,则连接建立;如果响应是false,则连接失败。

1
2
3
4
% 列出已经连接的节点列表
nodes().
% 输出是 : ['cloud@remote-host']
% 因为我们现在仅仅连接了一个远程节点

现在我们可以用RPC来运行远程节点的模块。

1
rpc:call('cloud@remote-host', os, cmd, [whoami]).

rpc:call()函数有4个入参。

第一个是节点名,第二个是模块名,第三个是函数名,第四个是函数的入参。

上述例子是我们运行os模块里的cmd()函数,入参是whoami。它将返回远程系统的当前用户名。os是Erlang的内建模块。

1
2
3
4
% 使用multicall函数 (跨所有连接的节点执行rpc调用)
rpc:multicall(nodes(), os, cmd, [whoami]).
% 与远程节点断开连接
erlang:disconnect_node('cloud@remote-host').

用同样的方式我们可以将不同的任务分布到不同的节点来处理,然后在主节点上获取结果。这就是在Erlang里一个分布式系统的运作方式。

原文链接: https://medium.com/@sakibsami/distributed-computing-using-erlang-1-cdd051a77c85#.maaswacq4