2

所以我有这个应用程序,它有一个进程,需要一些 gen_servers 在集群的其他地方存活。
如果它们启动它就可以工作,如果它们不是,我的 gen_server 在 init 中失败{error,Reason},这会通过我的主管传播到我的应用程序start函数中。
问题是,如果我返回 {ok,Pid} 以外的任何内容,我会收到崩溃报告。

我的意图是以某种方式表明应用程序无法正常启动并且所有进程都已关闭,因此不应将应用程序视为处于活动状态,但是,我只能选择返回 {ok, self()}并查看我的应用程序未列出的active情况,或返回 {error, Error} 并查看它是如何崩溃的:

{gen_server,init_it,6},{proc_lib,init_p_do_apply,3}]}},{ancestors,[rtb_sup,<0.134.0>]},
{messages,[]},{links,[<0.135.0>]},{dictionary,[]},{trap_exit,false},{status,running},
{heap_size,377},{stack_size,24},{reductions,255}],[]]:\n"

问题似乎比这更大,基本上没有办法告诉应用程序框架应用程序失败了。它可能看起来像是在 erlang 中处理的这些事情之一let the process die,但允许{error, }返回值application:start似乎是一个很好的权衡。

有什么提示吗?

4

1 回答 1

1

应用程序随时都会崩溃,因此应用程序在启动时的依赖关系无法提供有用的动态崩溃信息。

之前看过部分rabbitmq项目源码,也是一个基于集群的程序。

我认为rabbitmq您遇到了您所说的类似问题,因为集群需要收集相关nodes's的应用程序“在线”信息memory water highmark information然后做出决定。

它的解决方案是

  1. 将应用程序的第一个主进程注册到本地,在rabbitmq系统中名为“rabbit”,可以找到它是rabbit.erlfile,在函数“start/2”中。

    start(normal, []) -> case erts_version_check() of ok -> {ok, SupPid} = rabbit_sup:start_link(), true = register(rabbit, self()), print_banner(), [ok = run_boot_step(Step) || Step <- boot_steps()], io:format("~nbroker running~n"), {ok, SupPid}; Error -> Error end.

  2. 其他4个模块,rabbit_node_monitor.erl, rabbit_memory_monitor.erl, vm_memory_monitor.erl, rabbit_alarm.erl使用两种erlang技术,一个是监控进程以获取注册进程的“DOWN”消息,另一个是警报处理程序收集这些信息。

于 2012-05-25T04:55:45.537 回答