0

我只是碰巧读了 Joe Armstrong 的论文,对 Erlang 没有太多的先验知识。我想知道如果某些消息的送达收据从未到达会发生什么。发送演员做什么?它会再次发送消息吗?当接收方再次收到相同的消息时,这可能会使接收方演员感到困惑。它必须能够告诉它没有收到它的收据,因此第二条消息是无效的。

这类问题总是让我远离消息传递不是事务性的解决方案。我想我知道答案:发送参与者告诉它的监督参与者,当它没有在合理的时间内获得收据时一定是出了问题,导致监督者采取了一些行动(比如重新启动参与的参与者或其他事情)。这个对吗?我认为没有其他解决方案不会导致理论上可能的无限消息发送。

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

4

1 回答 1

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,
    ...

只需很少的工作,甚至可以将消息传递的调查委托给一个新进程 - 不阻塞检查 - 并使用链接进程,如果达到超时,则强制发送方崩溃。

于 2013-07-05T12:35:58.800 回答