Erlang/Akka等如何在引擎盖下发送消息?为什么';这不会导致僵局吗?

Erlang/Akka等如何在引擎盖下发送消息?为什么';这不会导致僵局吗?,erlang,akka,Erlang,Akka,消息发送是一个有用的抽象概念,但它似乎有点误导,因为它不像通过邮箱发送的信件那样在系统中移动 类似地,在卡夫卡中,他们谈论消息,但实际上只是读/写分布式、仅附加的日志 在Erlang/Akka中,实际上是复制数据而不是“发送数据”,那么这是如何工作的呢? 我想象着爱丽丝通过电话给鲍勃发信息 获取Alice队列(即邮箱)的锁 将消息写入队列 松开锁 做点别的 假设您可以向任何人发送消息,那么这如何不会导致进程都在等待消息的大规模死锁呢。为流行演员设置多个中间邮箱似乎很有用,这样您就可以编写这些邮箱

消息发送是一个有用的抽象概念,但它似乎有点误导,因为它不像通过邮箱发送的信件那样在系统中移动

类似地,在卡夫卡中,他们谈论消息,但实际上只是读/写分布式、仅附加的日志

在Erlang/Akka中,实际上是复制数据而不是“发送数据”,那么这是如何工作的呢? 我想象着爱丽丝通过电话给鲍勃发信息

  • 获取Alice队列(即邮箱)的锁
  • 将消息写入队列
  • 松开锁
  • 做点别的 假设您可以向任何人发送消息,那么这如何不会导致进程都在等待消息的大规模死锁呢。为流行演员设置多个中间邮箱似乎很有用,这样您就可以编写这些邮箱,然后更快地执行其他操作

  • 接收方在等待邮件时未锁定其邮箱;只有当它检查它时,才进行短暂的检查。如果没有匹配的消息,它将释放锁并进入睡眠状态,然后在新消息到达时被唤醒。同样,发送者也只需要在插入消息时获得锁。在这一级别上从来没有任何死锁情况

    进程可能仍然会因为逻辑错误而死锁,这两个进程都希望同时收到另一个进程的消息,但这是另一回事,消息传递样式使其不太可能在这种情况下结束,因为在用户级别没有锁管理


    正如您所提到的,是的,使用中间邮箱来减少争用非常有用(发送方可以添加到邮箱的传入端,而接收方则持有锁来扫描到目前为止到达的邮件),而这种优化是由Erlang VM在后台为您处理的。

    在Akka中,常见的邮箱实现是无锁的