2013-07-05 15 views
0

我刚刚读了Joe Armstrong的论文,并没有太多Erlang的知识。我想知道如果一些消息的送达收据永远不会到来会发生什么。派遣演员做什么?它再次发送消息?这可能会使接收者在另一次收到相同消息时混淆。它必须能够说明它的收据没有收到,因此第二条消息是无效的。如果回执无法到达,Erlang会发生什么?

这种问题总是让我远离消息传递不是事务性的解决方案。我想我知道答案:发送的演员告诉其监督演员,如果它没有在合理的时间内获得收据而导致监督员采取一些行动(如重新启动演员或某事),那么一定是错误的。它是否正确?我没有看到其他解决方案不会导致无限的消息发送。

感谢您的任何答案, 奥利弗

回答

2

在Erlang中,消息的发送者通常发送后立即忘记它,继续自己的工作。如果应用程序需要确认消息接收,则必须构建自己的协议(或使用现有的协议)。这有很多很好的理由。

其中之一是大多数时候没有必要握手。消息被忽略的风险越高,接收过程不再存在,或者同时死亡,在这种情况下,发件人几乎没有机会做一些有趣的事情。

另外,握手是阻止动作,所以会对性能产生影响,并且存在死锁的风险。

承认也应该是一个消息,但不应该承认这一个,否则你创建一个永无止境的消息循环。只有应用程序可以知道该做什么(例如使用带有确认的发送),编写这种函数(或使用实现它的行为)非常容易。例如:

send_with_ack(To,Mess,TimeOut,Ack) -> 
    Ref = make_ref(), 
    To ! {Mess,self(),Ref}, 
    receive 
     {Ack,Ref} -> Ack 
    after Timeout -> 
     {error,timeout} 
    end. 



receiving_process() -> 
    ... 
    receive 
     {Pattern_matching_Mess,From,Ref} -> 
      do_something(), 
      From ! {Ack,Ref}, %% Ack for this kind of message is known by the receiver 
      do_somethingelse(); 
     Mess1 -> do_otherthing() 
    end, 
    ... 

很少的工作,甚至有可能对消息传递的调查委托给一个新的进程 - 不堵检查 - 和使用链接的过程中,迫使发送者的崩溃,如果达到超时。

+0

感谢您分享您的知识。你知道是否有一些文件/书提到最佳实践如何处理这种事情? – OlliP

+0

我最喜欢的信息来源是http://learnyousomeerlang.com/,当你知道你在找什么时,官方文档值得你获取信息。你还有一些书:Francesco Cesarini和Simon Thompson编写的erlang; Erlang和OTP由Martin Logan,Eric Meritt和Richard Carlsson执行。最后,我还喜欢一系列截屏视频 - 由于采用了渐进的方法(kevin smith:实用的截屏视频) – Pascal

相关问题