gpt4 book ai didi

二郎监。重启进程,多次失败则放弃并发送消息

转载 作者:行者123 更新时间:2023-12-02 02:17:21 25 4
gpt4 key购买 nike

我有几个 gen_server 工作人员定期从硬件传感器请求一些信息。传感器可能会暂时失效,这是正常的。如果传感器失败,工作人员将异常终止。

所有工作人员都是通过 simple_one_to_one 策略生成的。我还有一个控件 gen_server,它可以启动和停止 worker,还可以接收 'DOWN' 消息。

所以现在我有两个问题:

  1. 如果 worker 被主管重启,它的状态就会丢失,这是我不能接受的。我需要重新创建具有相同状态的工作人员。

  2. 如果工作人员在一段时间内多次出现故障,则传感器发生了严重问题,需要运算符(operator)注意。因此我需要放弃重新启动 worker 并向事件处理程序发送消息。但是主管的默认行为是在耗尽进程重启限制后终止。

我看到两个解决方案:

  1. 在 supervisor 中将进程的类型设置为临时并控制它们并在控制 gen_server 中重新启动它们。但这正是主管应该做的,所以我正在重新发明轮子。

  2. 为主要主管下的每个 worker 创建一个主管。这正好解决了我的第二个问题,但是重启后worker的状态丢失了,因此我需要一些存储,比如ets表来存储worker的状态。

我是 Erlang 的新手,所以我需要一些关于我的问题的建议,关于哪种(如果有的话)解决方案是最好的。提前致谢。

最佳答案

If worker is restarted by supervisor its state is lost, which is not accertable to me. I need to recreate worker with the same state.

如果您需要流程状态来持久保存流程生命周期,则需要将其存储在其他地方,例如 ETS 表中。

If the worker is failing several times in particular amount of time something serious happened with sensors and it require operator's attention. Thus I need to give up restarting worker and send some message for event handlers. But default behaviuor of supervisor is terminate after exhaust process restart limit.

正确。一般来说,你对主管的逻辑越少越好。主管应该只监督子进程,仅此而已。但你仍然可以 monitor你的主管,并在你的主管放弃时得到通知(只是一个想法)。这样就可以避免重新发明轮子,用主管来管理 child 。

关于二郎监。重启进程,多次失败则放弃并发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9854010/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com