Wednesday, December 17, 2008

分布式gen_server结构

在programming in Erlang中 16章最后给出了my_bank.erl的一个gen_server 实现. 当时一直在琢磨分布式的问题.把C/S分离.后来做了测试. gen_server实现的6个必要条件是 start_link , init , handle_call , handle_cast , handle_info , terminate.
换句话说,这是最基本的gen_server实现. 那么我们只需要把这6个函数放在一个执行在服务器端的模块里.
然后其他逻辑就可以转移到客户端节点了.

而客户端的主要逻辑是:
gen_server:call(Name,Request).

这样一个部署逻辑就实现了. 在具体code过程中,
server:start_link 的Name 要用 {global,arbitary_atom}.

client:gen_server:call 的Name 要用 {global,arbitary_atom}.


最后集群启动 erl -name id@domain
发送简单的 net_adm:ping(server_id@domain).
(其实server ping client 也行,但是对于伸缩性集群来说,新节点加进来的时候,当然第一行动是它发出请求,而不是server.所以这里应当养成良好习惯)

这一步的作用是建立了节点之间的通信,在完成之后,节点间会把global注册了的全局名称发布到集群中.

gen_server的分布式结构就完成了. 当我们构建一个强大多应用的服务器时,就可以把gen_server的逻辑分成N部分,然后部署到N个节点中.

这样,ERLANG的巨大威力就完美的发挥了.

No comments:

Followers