我对如何设计erlang应用程序存在疑问:
我通常创建一个应用程序,启动一个主管和一些工作人员。除了监督树之外,我还有带有功能(duh)的模块。我也有一个Web API,可以从应用程序的模块中调用函数。当我停止应用程序(application:stop(foo).)时,网络服务器仍可以调用foo的函数。
我发现无法为该foo应用程序配备合适的断路器“不是惯用的” 。
这是否意味着每个公共职能部门foo都应在其主管的监督下产生一个流程?
谢谢,巴斯蒂安
不一定有两个原因:
该foo应用程序将具有两种功能:需要运行工作进程的功能和不需要运行的功能(很可能是纯功能)。如果应用程序已停止,则显然前者在调用时将失败,而后者仍将工作。按照Erlang的“让它崩溃”的理念,这只是Web服务器需要处理(或不处理)的另一个错误条件。如果纯功能仍然有效,则没有理由禁止Web服务器调用它们:这意味着系统的大部分功能正常。
在Erlang节点中,停止应用程序通常不是您要做的事情。Erlang应用程序声明依赖关系,即需要运行才能使其正常运行的应用程序。您会注意到,如果尝试在依赖项之前启动应用程序,它将拒绝启动。尽管可以手动停止应用程序,但这意味着节点的状态不再符合应用程序模型的假设。在构建由一组Erlang应用程序组成的“发行版”时,通常它们都将作为permanent应用程序启动,这意味着如果任何一个应用程序崩溃,整个Erlang节点将退出,以免违反此假设。