我有几个gen_server
工人定期从硬件传感器请求一些信息。传感器可能会暂时失效,这是正常的。如果传感器失败,工作人员会因异常而终止。
所有工人都是从具有simple_one_to_one
策略的主管中产生的。我还有一个控件gen_server
,它可以启动和停止工作人员,还可以接收'DOWN'
消息。
所以现在我有两个问题:
如果工作人员由主管重新启动,则其状态将丢失,这对我来说是不可接受的。我需要重新创建具有相同状态的工人。
如果工人在一段时间内多次失败,则传感器发生了严重的事情,需要操作员注意。因此我需要放弃重新启动工作程序并向事件处理程序发送消息。但是主管的默认行为是在耗尽进程重启限制后终止。
我看到两个解决方案:
将supervisor中的进程类型设置为临时并控制它们并在控制中重新启动它们
gen_server
。但这正是主管应该做的,所以我在重新发明轮子。为主要主管下的每个工人创建一个主管。这正好解决了我的第二个问题,但是重启后worker的状态会丢失,因此我需要一些像ets table这样的存储来存储worker的状态。
我对 Erlang 很陌生,所以我需要一些关于我的问题的建议,关于哪种(如果有的话)解决方案是最好的。提前致谢。