【问题标题】:Erlang Supervisors - Shared Process MailboxesErlang Supervisors - 共享进程邮箱
【发布时间】:2026-02-06 16:50:01
【问题描述】:

我有一个监控两个子进程的主管进程;一个主进程和一个备份进程(以防主进程退出)。

如果主进程出现故障而邮箱中仍有邮件,是否有办法让备份进程接管并处理留在原始主进程邮箱中的邮件?

【问题讨论】:

  • 节点还是进程?这是 Erlang 世界中的两个不同概念。

标签: erlang erlang-supervisor


【解决方案1】:

如果您指的是进程而不是节点,并且您想确保所有传入的消息都得到处理。无论是通过主进程还是备份进程,最好将传入消息直接存储在 Mnesia 表中。这样您就可以在备份过程中继续处理。

也就是说,我认为您尝试解决的问题可以由 OTP 自动处理。您永远不需要创建备份进程。如果一个崩溃了,你可以告诉主管重新生成相同的 gen_server。

【讨论】:

  • [来自感兴趣的读者的问题]。这是否意味着进程的邮箱在重生后仍然存在?即当进程重新启动时,终止前邮箱中的任何消息仍然存在吗?谢谢。
  • 不,它丢失了,这就是为什么你需要把它放在一个 ets 或 Mnesia 表中。
  • 啊-好的。没想到他们活了下来,只是把你的答案读错了。谢谢澄清。
【解决方案2】:

在这种情况下,我通常会将传入的消息推送到 ets 表中。这有一些微妙之处。进一步讨论here

【讨论】: