erlang多节点name conflict
2013-07-18 22:51
183 查看
今天游戏更新出现了一个问题,环境是这样的:顺序启动S1、S2、S3三个游戏服务器节点,能够正常工作。接着启动一个中央后台节点A,S1、S2、S3每隔几十秒的时间就会与节点A通信一次(使用erlang的进程通信方式),结果很快S2、S3崩溃了,S1能够正常工作。
查看到S2上的错误报如下:
(s2@192.168.0.1)1>
=CRASH REPORT==== 18-Jul-2013::11:21:46 ===
crasher:
initial call: application_master:init/4
pid: <0.48.0>
registered_name: []
exception exit: killed
in function application_master:terminate/2 (application_master.erl, line
229)
ancestors: [<0.47.0>]
messages: []
links: [<0.6.0>]
dictionary: []
trap_exit: true
status: running
heap_size: 1597
stack_size: 24
reductions: 4422
neighbours:
(g002@192.168.51.99)1>
=INFO REPORT==== 18-Jul-2013::11:21:46 ===
application: game_server
exited: killed
type: temporary
上面的错误信息无法看出端倪,接着在节点A上的发现如下错误信息 :
=INFO REPORT==== 18-Jul-2013::11:21:46 ===
global: Name conflict terminating {waitforstart,<6533.49.0>}
** at node s2@192.168.0.1 **
这个错误信息提示的很明显了,全局的命名waitforstart有冲突。搜索了下代码果然发现了全局的注册函数
global:register_name(waitforstart, self())
将S1,S2,S3的代码修改一下,注册互不相同的全局名字,测试一切都正常了。
疑问?
命名的冲突是发生在S1,S2,S3节点上的,看起来跟节点A没有什么关系啊?
这是由于A未启动之前,S1,S2,S3之间没有任何的通信,所以不会去检测是否有全局的名字冲突。
可以做一个简单的测试来证明这个问题,启动S1,S2 不启动A,在S2上执行下面的命令
net_adm:ping('s1@192.168.0.1').
结果s2立马崩溃了
查看到S2上的错误报如下:
(s2@192.168.0.1)1>
=CRASH REPORT==== 18-Jul-2013::11:21:46 ===
crasher:
initial call: application_master:init/4
pid: <0.48.0>
registered_name: []
exception exit: killed
in function application_master:terminate/2 (application_master.erl, line
229)
ancestors: [<0.47.0>]
messages: []
links: [<0.6.0>]
dictionary: []
trap_exit: true
status: running
heap_size: 1597
stack_size: 24
reductions: 4422
neighbours:
(g002@192.168.51.99)1>
=INFO REPORT==== 18-Jul-2013::11:21:46 ===
application: game_server
exited: killed
type: temporary
上面的错误信息无法看出端倪,接着在节点A上的发现如下错误信息 :
=INFO REPORT==== 18-Jul-2013::11:21:46 ===
global: Name conflict terminating {waitforstart,<6533.49.0>}
** at node s2@192.168.0.1 **
这个错误信息提示的很明显了,全局的命名waitforstart有冲突。搜索了下代码果然发现了全局的注册函数
global:register_name(waitforstart, self())
将S1,S2,S3的代码修改一下,注册互不相同的全局名字,测试一切都正常了。
疑问?
命名的冲突是发生在S1,S2,S3节点上的,看起来跟节点A没有什么关系啊?
这是由于A未启动之前,S1,S2,S3之间没有任何的通信,所以不会去检测是否有全局的名字冲突。
可以做一个简单的测试来证明这个问题,启动S1,S2 不启动A,在S2上执行下面的命令
net_adm:ping('s1@192.168.0.1').
结果s2立马崩溃了
相关文章推荐
- RabbitMQ>Erlang machine stopped instantly (distribution name conflict?). The service is not restarted as OnFail is set to ignore.-报错解决方案 原来是NNND。。。
- dom4j如何取得name相同的节点
- nodeName、nodeValue 以及 nodeType 包含有关于节点的信息
- erlang局域网内节点通信——艰难四步曲 (转)
- 解决erlang节点启动失败报["inet_tcp",econnrefused]的问题
- erlang节点局域网通信
- Erlang节点连接
- Erlang与C构建的节点通讯
- [Erlang 0098] net_kernel与节点互连,断开,监控
- 进一步优化—IE8以下浏览器不支持document.getElementsByClassName() 访问节点;怎么解决?---封装自己的类名
- Multiple process create and delete the same name file conflict
- [erlang学习] 用observer远程监控节点 (随笔简记)
- erlang节点编程
- 遍历getElementsByName删除节点
- DOM节点中属性nodeName、nodeType和nodeValue的区别 < Delphi >
- 认识DOM的三大节点:元素节点,文本节点,属性节点以及nodeName,nodeType,nodeValue的区别
- js操作节点,ID,name,calssname,tag,style
- Action的mapping.findFoward(forwardName)必须要在struts-config.xml中的对应的action节点配置一个forward节点
- 一次erlang 节点CPU严重波动排查
- [疯狂Java]I/O:File(文件类,也是文件流的节点)、FilenameFilter(文件过滤器)