Erlang应用程序设计(如何短路)
Erlang applications design (how to short-circuit)
我有一个关于我如何设计我的 erlang 应用程序的存在问题:
我通常创建一个应用程序,启动一个主管和一些工人。
除了监督树之外,我还有带功能的模块(duh)。
我还有一个 Web API 可以调用应用程序模块中的函数。
当我停止我的应用程序 (application:stop(foo).
) 时,网络服务器仍然可以调用 foo
的功能。
我发现 "not idiomatic" 无法为 foo
应用程序配备合适的断路器。
这是否意味着 foo
中的每个 public 函数都应该在其主管下生成一个进程?
谢谢,
巴斯蒂安
不一定,原因有二:
foo
应用程序将有两种函数:需要工作进程为 运行 的函数和不需要的函数(很可能是纯函数)。如果应用程序停止,显然前者在调用时会失败,而后者仍然有效。根据 Erlang 的 "let it crash" 理念,这只是 Web 服务器需要处理(或不处理)的另一种错误情况。如果纯函数仍然有效,则没有理由禁止 Web 服务器调用它们:这意味着系统的大部分功能正常。
在 Erlang 节点中,停止应用程序不是您通常会做的事情。 Erlang 应用程序声明依赖项,即需要 运行 才能正常运行的应用程序。您会注意到,如果您尝试在其依赖项之前启动应用程序,它将拒绝启动。虽然可以手动停止应用程序,但这意味着节点的状态不再符合应用程序模型的假设。在构建由一组 Erlang 应用程序组成的 "release" 时,通常它们将作为 permanent
个应用程序启动,这意味着如果任何一个应用程序崩溃,整个 Erlang 节点将退出,以免违反这个假设。
我有一个关于我如何设计我的 erlang 应用程序的存在问题:
我通常创建一个应用程序,启动一个主管和一些工人。
除了监督树之外,我还有带功能的模块(duh)。
我还有一个 Web API 可以调用应用程序模块中的函数。
当我停止我的应用程序 (application:stop(foo).
) 时,网络服务器仍然可以调用 foo
的功能。
我发现 "not idiomatic" 无法为 foo
应用程序配备合适的断路器。
这是否意味着 foo
中的每个 public 函数都应该在其主管下生成一个进程?
谢谢, 巴斯蒂安
不一定,原因有二:
foo
应用程序将有两种函数:需要工作进程为 运行 的函数和不需要的函数(很可能是纯函数)。如果应用程序停止,显然前者在调用时会失败,而后者仍然有效。根据 Erlang 的 "let it crash" 理念,这只是 Web 服务器需要处理(或不处理)的另一种错误情况。如果纯函数仍然有效,则没有理由禁止 Web 服务器调用它们:这意味着系统的大部分功能正常。
在 Erlang 节点中,停止应用程序不是您通常会做的事情。 Erlang 应用程序声明依赖项,即需要 运行 才能正常运行的应用程序。您会注意到,如果您尝试在其依赖项之前启动应用程序,它将拒绝启动。虽然可以手动停止应用程序,但这意味着节点的状态不再符合应用程序模型的假设。在构建由一组 Erlang 应用程序组成的 "release" 时,通常它们将作为 permanent
个应用程序启动,这意味着如果任何一个应用程序崩溃,整个 Erlang 节点将退出,以免违反这个假设。