Erlang/Akka 等如何在幕后发送消息?为什么不会导致死锁呢?

How do Erlang/Akka etc. send messages under the hood? Why doesn't it lead to deadlock?

消息发送是一个有用的抽象,但它似乎有点误导,因为它不像通过 post 盒子发送的信件在系统中真正移动。

类似地,在 Kafka 中,他们谈论消息,但实际上它只是 reading/writing 到分布式的、仅追加的日志。

在 Erlang/Akka 中,您实际上复制的是数据而不是 'send it' 那么这是如何工作的? 我在想象爱丽丝通过

向鲍勃发送消息
  1. 获取 Alice 队列(即邮箱)的锁
  2. 将消息写入队列
  3. 解除锁定
  4. 做点别的 鉴于您可以向任何人发送消息,这怎么会导致所有进程都在等待向 Alice 发送消息的大量死锁。为受欢迎的演员提供多个中间邮箱似乎很有用,这样您就可以写信给它,然后更快地去做其他事情。

收件人在等待消息时没有锁定其邮箱;只有当它检查它时,才会短暂地。如果没有匹配的消息,它会释放锁并进入休眠状态,然后在新消息到达时被唤醒。同样,发送者也只需要在插入消息时获取锁。这个级别从来没有出现过死锁的情况。

进程可能仍然会因为逻辑错误而陷入僵局,在这种情况下,双方都希望同时收到来自对方的消息,但这是另一回事,消息传递风格使得这种情况不太可能结束,因为没有锁管理来搞砸用户级别。

正如您提到的,是的,拥有中间邮箱以减少争用很有用(发件人可以添加到邮箱的传入端,而收件人持有锁以扫描到目前为止到达的邮件), Erlang VM 会在后台为您处理优化。