我们在应用程序中使用带有 slave
模块的 Erlang,该应用程序在不同的机器上生成从属节点,这些从属节点向另一台机器上的主节点报告并由其协调。从属节点在其机器上打开端口并运行一些外部程序(本质上,erlang 从属节点(我们称之为工作人员)只是外部程序的精美包装器)。
但是,我们遇到了一些意想不到的问题,但我们还没有找到好的解决方案。
代码分发。目前,我们的 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 本身一样。一旦它们位于远程计算机上的代码路径中,您就可以随心所欲地加载、卸载和热交换:)
wrt 第 #2 项:您是否已验证您的从属模块代码是否可以向您的主节点输出天真的错误消息(即 erlang:display()
)?在这种情况下,问题在于更大的配置 - 尝试将 error_logger_redirect
设置为 false
作为快速测试,也许...如果这些都没有用,请提前道歉!
关于Erlang的从模块: code and IO distribution,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13288265/