假设我有一个父母和一些孩子的监督树。孩子们是短暂的。但是被其他进程使用。父母负责将用户指向正确的孩子。
User ---lookup(child)--> Parent
User <----PidOfChild----- Parent
User --request(Resouce)--> Child
User <------respond------ Child
让我们说孩子在两个序列之间关闭,为了避免用户端崩溃,关闭孩子的正确方法是什么?
用户可以监控孩子,但这确实有帮助。既然用户在一次交易中做了所有这些?
答案 0 :(得分:2)
在这种情况下,正确的解决方案是在用户端处理它:没有故障保护方式“关闭”孩子,使其响应用户。总会有某种竞争条件将其搞砸。
如果您正在使用gen_server:cast / call,则可以在请求失败之前提供等待时间的超时并正确捕获它。如果使用原始接收块:
receive
some_response -> {ok, some_response}
after
5000 -> % do something.
end.
答案 1 :(得分:1)
如果您正考虑采用另一种方法来避免在用户端拥有某些内容,则可以将父级作为消息代理,如果您正在呼叫父级并立即呼叫子级。
User ---request(Resouce)--> Parent --request(Resouce)--> Child
User <---reponse------------ Parent <-response----------- Child
父母必须将请求转发给孩子,这样才能避免阻止。这样父母也可以跟踪孩子并相应地响应用户。如果子项关闭,它可以相应地重新启动,或者如果没有活动请求,它可以关闭子项。父母不应该进行任何处理,因为它可能成为这种方法的瓶颈。
答案 2 :(得分:0)
如果您的请求是在子项关闭之前构建的,则应使用receive ... after ...或gen_server:call scheme。 如果你的请求是在孩子关闭之后构建的,也许你可以等待超时请求或者孩子是avalibe。