博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Erlang 0005] net_kernel:monitor_nodes 订阅node连接\断开消息
阅读量:6770 次
发布时间:2019-06-26

本文共 3380 字,大约阅读时间需要 11 分钟。

 Erlang中节点之间建立链接我们可以使用net_adm:ping(),连接成功返回pong,失败返回pang;实践中我们不仅仅是要建立连接,比如我们需要在与其它节点建立连接或者其它节点断开的时候做一些事情,比如在节点当掉的时候记录日志,这就需要在对应的时机取得相应的信息;Erlang在net_kernel库中提供了这样的方法:net_kernel:monitor_nodes(Flag);调用这个方法来订阅节点状态变动的消息.一个节点加入的时候会向所有的订阅进程发送一个nodeup消息,一个节点断开的时候会发送nodedown消息. 

   看规格说明中,我们可以对订阅的消息进行定制:

   doc地址: 

monitor_nodes(Flag) 
->
 ok 
|
 Error
monitor_nodes(Flag, Options) 
->
 ok 
|
 Error
Types:
Flag = boolean()
Options = [Option]
Option = {node_type, NodeType} 
|
 nodedown_reason
NodeType = visible 
|
 hidden 
|
 all
Error = error 
|
 {error, term()}

  

一个典型的应用就是rabbitmq项目中rabbit_node_monitor的代码,关于rabbitmq项目,解析:

在下面这段代码里面rabbit_node_monitor是一个gen_server,在它启动的回调函数中,调用了 net_kernel:monitor_nodes(true)方法,同时在handle_info中添加了对nodeup和nodedown消息的处理,这段代码里面在和其它节点建立链接的时候(nodeup)记录了日志,在节点当掉的时候(nodedown)做了数据库和网络的清理

工作,相关的代码文件位置:   

-
module
(rabbit_node_monitor).
-
behaviour(gen_server).
-
export([start_link
/
0
]).
-
export([init
/
1
, handle_call
/
3
, handle_cast
/
2
, handle_info
/
2
,
terminate
/
2
, code_change
/
3
]).
-
define(SERVER, ?MODULE).
%%
--
------------------------------------------------------------------
start_link() 
->
gen_server:start_link({
local
, ?SERVER}, ?MODULE, [], []).
%%
--
------------------------------------------------------------------
init([]) 
->
ok 
=
 net_kernel:monitor_nodes(
true
),
{ok, no_state}.
handle_call(
_Request
_From
, State) 
->
{noreply, State}.
handle_cast(
_Msg
, State) 
->
{noreply, State}.
handle_info({nodeup, Node}, State) 
->
rabbit_log:info(
"
node ~p up
"
, [Node]),
{noreply, State};
handle_info({nodedown, Node}, State) 
->
rabbit_log:info(
"
node ~p down
"
, [Node]),
%%
 TODO: This may turn out to be a performance hog when there are
%%
 lots of nodes. We really only need to execute this code on
%%
*
one
*
 node, rather than all of them.
ok 
=
 rabbit_networking:on_node_down(Node),
ok 
=
 rabbit_amqqueue:on_node_down(Node),
{noreply, State};
handle_info(
_Info
, State) 
->
{noreply, State}.
terminate(
_Reason
_State
->
ok.
code_change(
_OldVsn
, State, 
_Extra
->
{ok, State}.
%%
--
------------------------------------------------------------------

  成功开源项目中可挖掘的东西真是多,特别是学习一个新东西的时候,需要从广泛涉猎一些开源项目,开阔眼界,积累知识,继续!

2012-11-4 17:57:57更新 主动断开节点

 

Erlang : Disconnect Unwanted Nodes

 
When you use same cookie for all nodes in a distributed Erlang system, you might have probably seen that all the nodes are interconnected with each other.
(mathu@mathu)>
(mathu@mathu)> nodes().
[mathu9@mathu,mathu1@mathu,mathu2@mathu,mathu3@mathu,
 mathu4@mathu,mathu5@mathu,mathu6@mathu,mathu7@mathu,
 mathu15@mathu,mathu12@mathu,mathu14@mathu,mathu11@mathu,
 mathu10@mathu,mathu13@mathu,mathu8@mathu,mathu9@mathu]
(mathu@mathu)>
Having unwanted nodes connected is overhead for the system. Therefore the bellow one-liner will help to make it clean.
 
[net_kernel:disconnect(X) || X <- nodes() -- [List_of_wanted_nodes]].
(mathu@mathu)3> [net_kernel:disconnect(X) || X <- nodes() -- [mathu3@mathu, mathu4@mathu]].
[true,true,true,true,true,true,true,true,true,true,true,
 true,true]
(mathu@mathu)4> nodes().
[mathu3@mathu,mathu4@mathu]
(mathu@mathu)5> 
- Mathuvathanan Mounasmay

 

与其后面踢掉不如限制可以链接的节点:

allow(Nodes) -> ok | errorTypes:Nodes = [node()]Limits access to the specified set of nodes. Any access attempts made from (or to) nodes not in Nodes will be rejected.Returns error if any element in Nodes is not an atom.

余锋有一篇文章专门介绍: Erlang如何限制节点对集群的访问之net_kernel:allow 

转载地址:http://xndeo.baihongyu.com/

你可能感兴趣的文章
C#中为什么需要装箱拆箱操作?
查看>>
PHP类中一般方法与静态方法的疑问
查看>>
[转]PHP花括号变量
查看>>
【Opencv学习】摄像头采集、录像、截图小工具
查看>>
Fedora16安装中文语言包和中文输入法
查看>>
Windows 8实用窍门系列:14.windows 8中粘贴板(剪切板)的使用
查看>>
长连接API小心“窜包”问题
查看>>
开发者基础知识游戏,共10关,欢迎挑战
查看>>
ASP.NET中 RadioButtonList(单选按钮组)的使用
查看>>
SESSION 丢失
查看>>
DES可逆加解密
查看>>
图解Undo原理
查看>>
Kinect for Windows SDK V1.7 发布
查看>>
JAVA中的参数按值传递与按引用传递
查看>>
与Recommender System相关的会议及期刊
查看>>
如何理解ip路由和操作linux的路由表
查看>>
WCF的几种寄宿方式 ( 转)
查看>>
数字数据fzu 2120 数字排列
查看>>
ORACLE 数据库 SQL 转换 只取 年和月
查看>>
区间查询[2009国家集训队]小Z的袜子(hose)
查看>>