Erlang的从属模块:代码和IO分发

ext*_*erm 6 erlang erlang-otp slave

我们slave在应用程序中使用Erlang和模块,该应用程序在不同的机器上生成从属节点,这些机器向另一台机器上的主节点报告并由其协调.从属节点在他们的机器上打开端口并运行一些外部程序(本质上,erlang从属节点(我们称之为工作者)只是围绕外部程序的奇特包装).

但是,我们遇到了一些意想不到的问题,我们还没有找到好的解决方案.

  1. 代码分发.目前我们的Makefile将已编译的erlang代码(ebin文件夹)rsyn为运行工作节点的机器,我们通过-pa工作节点启动时的参数加载它.确实应该有一些通过Erlang在运行时自动分发代码的方法,但我们不知道该怎么做.

  2. 日志记录.从模块文档说"从站生成的所有TTY输出都将被发送回主节点".但是,当我们lager在slave(worker)节点上运行(basho logger)时,它的输出不会被重定向到主节点的tty(只有主节点的日志输出).目前,我们在主节点上运行一个进程,该进程记录(通过lager)从从节点获取的消息.因此,为了在从属节点上记录某些内容,我们将消息发送到主节点.

我们正在启动这样的工作节点:

slave:start(IP, NodeName, NodeArgs)
Run Code Online (Sandbox Code Playgroud)

这里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
Run Code Online (Sandbox Code Playgroud)

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

snw*_*ght 2

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

wrt 项目#2:您是否已验证您的从属模块代码可以erlang:display()向您的主节点输出天真的错误消息(即)?在这种情况下,问题是更大的配置 - 尝试设置error_logger_redirectfalse快速测试,也许......如果这些都没有用,请提前道歉!