加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 在akka演员的消息传递序列

发布时间:2020-12-16 09:13:45 所属栏目:安全 来源:网络整理
导读:我对Akka很新,在参考手册中找不到答案. 假设我们在3台机器(A,B,C)的集群中分配了远程执行器,其中一个演员居住在每台机器上,而另一个演员则具有actorRef到另外2个机器,即: Machine A:A (real actor)- B (ref)- C (ref)Machine B:- A (ref)B (real actor)- C
我对Akka很新,在参考手册中找不到答案.

假设我们在3台机器(A,B,C)的集群中分配了远程执行器,其中一个演员居住在每台机器上,而另一个演员则具有actorRef到另外2个机器,即:

Machine A:
A (real actor)
-> B (ref)
-> C (ref)

Machine B:
-> A (ref)
B (real actor)
-> C (ref)

Machine C:
-> A (ref)
-> B (ref)
C (real actor)

演员A执行以下代码:

bRef ! msg1
bRef ! msg2

演员B在消息处理程序中执行以下代码:

case msg1 => 
    cRef ! msg3
    aRef ! msg4

演员C执行消息处理程序中的以下代码:

case msg3 => 
    aRef ! msg5

我可以做出以下假设(如果有):

> actor B在获取msg2之前得到msg1
>演员A在获得msg4之前得到msg5

后续问题可能导致以上理解:
是邮件发送的!操作符通过网络真正异步或者等到接收邮箱收到?
即做线

bRef ! msg1

阻止直到actor B在其邮箱中获取消息,或者它产生处理传递并继续执行的线程

bRef ! msg2

之前它甚至知道演员B得到了msg1?

解决方法

对于(1)您有保证msg2将在msg2之前被调度员排队.实际发生的事情真的取决于您使用哪个调度程序: http://akka.io/docs/akka/1.1.2/scala/dispatchers.html,但在您的情况下,只要B可以接受两个消息,那么它将始终在msg2之前收到msg1.

对于(2),不,你没有这个保证.的!只要调度员将消息排入队列,当消息被目标actor的邮箱接受时,该方法就会返回.然后发送在另一个线程中完成,并受到各种竞争条件的约束.

Is message sent by the ! operator through the network truly asynchronously or does it wait until the receiving mailbox gets it?

您可以使用带有本地actor的BoundedMailbox来显示向调度程序发送的消息与…异步:

class TestActor extends Actor {
  val mailboxCapacity = BoundedMailbox(capacity = 1)
  self.dispatcher = Dispatchers.newExecutorBasedEventDrivenDispatcher("test",1,mailboxCapacity).build

  def receive = {
    case x: String => 
      Thread.sleep(1000)
      println("Received message")
    case _ => 
  }
}

val t = Actor.actorOf[TestActor]
t.start()

t ! "one"; t ! "two"; t ! "three"; println("Main thread");

打印:

scala>     t ! "one"; t ! "two"; t ! "three"; println("Main thread");
Received message
Main thread

scala> Received message
Received message

这意味着主线程中的代码执行在你甚至知道消息是否将被传递之前继续.在这种情况下,如果我们在调度程序上设置了一个pushTimeout并使Thread.sleep等待超过超时时间,那么发送的消息可能很容易超时.

比较这个使用!!:

scala>     t !! "one"; t !! "two"; t !! "three"; println("test");
Received message
Received message
Received message
test

所以,考虑到这一点.实现(2)的方式是:

case msg1 =>
  cRef !! msg3
  aRef ! msg4

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读