erlang - Erlang/Akka 等如何在后台发送消息?为什么不会导致僵局?

标签 erlang akka

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

类似地,在 Kafka 中,他们谈论消息,但实际上它只是读取/写入分布式、仅附加日志。

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

向鲍勃发送消息
  1. 获取 Alice 队列(即邮箱)的锁
  2. 将消息写入队列
  3. 释放锁
  4. 做点别的事 假设您可以向任何人发送消息,这如何不会导致所有进程都等待向 Alice 发送消息的大规模死锁。为受欢迎的 Actor 提供多个中间邮箱似乎可能很有用,这样您就可以写信给该邮箱,然后更快地做其他事情。

最佳答案

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

由于逻辑错误,进程仍然可能陷入僵局,其中两个进程同时期待来自另一个进程的消息,但这是另一回事,并且消息传递风格使其不太可能最终陷入这种情况,因为有没有锁管理会搞砸用户级别。

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

关于erlang - Erlang/Akka 等如何在后台发送消息?为什么不会导致僵局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65902202/

相关文章:

erlang - 在一台机器上安装多个版本的 Erlang/OTP

erlang - 为什么erlang是:now() specced such that it may skew the time of a node?

scala - 记录到 Scala/akka 中的文件 : ClassNotFoundException: akka. event.slf4j.Slf4jLoggingFilter

scala - 更改正在运行的 Actor 系统的日志级别?

node.js - 使用 Node.js 和 Nginx 进行负载平衡长轮询请求

erlang - 如何在使用 relx 发布汇编程序构建的应用程序中正确使用同步?

Erlang 记录到元组列表

java - 我什么时候必须停止我的 Actor ?

scala - Scala 如何实现并行性?

java - 在 Guice 初始化中使用先前注入(inject)的绑定(bind)