我们在一个应用程序中将erlang与slave模块一起使用,该应用程序在不同计算机上生成从属节点,这些从节点向另一台计算机上的主节点报告并由其协调。从属节点在其计算机上打开端口并运行一些外部程序(实际上,erlang从属节点(我们称它们为worker)只是外部程序周围的精美包装)。

但是,我们遇到了一些未曾预料到的问题,但尚未找到好的解决方案。

  • 代码分配。当前,我们的Makefile将已编译的erlang代码(ebin文件夹)同步到运行工作程序节点的计算机,并在工作程序节点启动时通过-pa参数加载它。确实应该有某种方法可以在运行时通过Erlang自动分发代码,但是我们不确定该怎么做。
  • 正在记录。从模块的文档说:“在从模块上产生的所有TTY输出将被发送回主节点”。但是,当我们在从属节点(工作节点)上运行lager(Basho记录器)时,其输出不会重定向到主节点的tty(只有主节点的日志输出)。当前,我们有一个在主节点上运行的进程,该进程记录(通过更大的)从从节点获得的消息。因此,为了在从属节点上记录某些内容,我们将消息发送到主节点。

  • 我们正在像这样启动工作节点:
    slave:start(IP, NodeName, NodeArgs)
    
    NodeArgs在哪里
     -setcookie thecookie -pa /home/dau/mapro/deps/nicedecimal/ebin/ /home/dau/mapro/deps/meck/ebin/ /home/dau/mapro/deps/lager/ebin/ /home/dau/mapro/deps/jsx/ebin/ /home/dau/mapro/apps/worker/ebin/ /home/dau/mapro/ebin/ -s worker_app
    

    其中所有给定路径都是运行工作程序节点的计算机上的绝对路径。

    最佳答案

    就第1项而言,您所做的事情是正确的:您负责在远程主机上安装Erlang源模块或预编译的Beam文件,就像负责OTP/Erlang本身的安装一样。一旦它们进入远程计算机的代码路径中,您就可以加载和卸载以及热交换到您内心的内容,尽管:)

    关于项目#2:您是否已验证从模块代码可以将原始错误消息(即erlang:display())输出到主节点?在这种情况下,问题出在更大的配置上-尝试将error_logger_redirect设置为false作为快速测试,也许...如果没有用的话,请提前道歉!

    关于Erlang的从模块: code and IO distribution,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13288265/

    10-17 01:25