我遇到的实时代码升级问题是监督树的结构发生了变化。监督类型MyApp.Worker1
的流程和类型MyApp.Worker2
的流程的主管现在还需要监督类型MyApp.Worker3
的第三个流程。
更新MySupervisor.init/1
将正确启动主管,但不会更改当前主管的结构,假设主管从不崩溃。
显然,我可以重新启动节点,但这会破坏实时代码升级的目的。如果我已经注册了主管,我可以my_app remote_console
进入并手动执行Supervisor.start_child/2
,但是对于许多节点进行广泛部署,手动干预是不可行的。
在实时代码升级期间更新监督树(添加和删除)的最佳做法是什么?理想情况下,这将考虑Erlang和Elixir模块之间的任何差异(也可以是跨语言兼容)