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



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

类似地,在Kafka中,他们谈论消息,但实际上它只是读/写一个分布式的,只能追加的日志。

在Erlang/Akka中,你实际上是复制数据而不是"发送它",那么这是如何工作的呢?我在想象像Alice通过 向Bob发送消息这样的东西
  1. 获取Alice队列(即邮箱)的锁
  2. 将消息写入队列
  3. 释放锁
  4. 做点别的考虑到您可以向任何人发送消息,这如何不会导致所有进程都在等待消息Alice而导致大量死锁呢?为流行演员设置多个中间邮箱似乎很有用,这样你就可以写东西,然后去做其他更快的事情。

接收方在等待消息时未锁定邮箱;只有当它检查它的时候。如果没有匹配的消息,它将释放锁并进入睡眠状态,然后在新消息到达时被唤醒。同样,发送方也只需要在插入消息时获取锁。在这个级别上永远不会出现死锁情况。

进程可能仍然会因为逻辑错误而陷入死锁,当两个进程同时期望来自另一个进程的消息时,但这是另一回事,消息传递风格使它不太可能在这种情况下结束,因为在用户级别上没有锁管理。

正如您提到的,是的,使用中间邮箱来减少争用是有用的(发送方可以向邮箱的传入端添加消息,而接收方则持有锁以扫描到目前为止到达的消息),并且Erlang VM会在底层为您处理该优化。

最新更新