我是akka的新手。我在本地机器上的两个节点之间做了两个演员(Ping Actor和Pong Actor)之间的乒乓示例,然后以两种不同的方式测试它们。基本上,Ping Actor会向Pong Actor发送一条消息System.nanoTime()
。得到消息后,Pong演员将收到的纳秒时间重新发送给Ping Actor。
然后我就可以计算一轮乒乓球的拍摄时间。
方式1:主要< - > pingActor< - > pongActor
MAIN1:
for (int i = 0; i < 10; i++) {
pingActor.tell("start", null);
}
PingActor:
public Receive createReceive() {
return receiveBuilder()
.matchEquals("start", start -> {
pongActor.tel(System.nanoTime(), self());
})
.match(String.class, aboveTime -> {
long timeDiff = System.nanoTime() - Long.parseLong(aboveTime);
System.out.println(timeDiff);
})
.build();
}
方式2:主要 - &gt; pingActor&lt; - &gt; pongActor
MAIN2:
pingActor.tell("start", null);
PingActor:
public Receive createReceive() {
return receiveBuilder()
.matchEquals("start", start -> {
pongActor.tel(System.nanoTime(), self());
})
.match(String.class, aboveTime -> {
long timeDiff = System.nanoTime() - Long.parseLong(aboveTime);
System.out.println(timeDiff);
pongActor.tel(time, self());
})
.build();
}
我的测试结果显示第一种方式比第二种方式(平均1ms)慢得多(平均100ms)。我需要解释,以及如何尽可能快地从演员外部拨打电话? 谢谢
答案 0 :(得分:0)
way1&amp;的比较way2不公平。
<强> WAY1 强>
Ping
actor将同时处理多条消息,因为Main1
的发送速度太快,某些消息将在邮箱中排队,这导致来自{{的某些响应消息1}}也在Pong
的邮箱中排队,所以这里的不同之处并不是邮件传输的实际速度。
你需要知道演员是在一个线程中运行,除非你增加Ping
。同时,akka的actor模型不使用coroutine,在后端它仍然可以在线程池上工作,所以如果场景更复杂,你可能会发现更多的延迟,所以你需要小心处理基于akka的应用程序的非阻塞
<强> way2 强>
从nr-of-instances
的解释,您可以发现您的way1
实际上是以序列模式运行,其中不同反映了演员之间的实际传输速度,它不包括缓冲区队列中的时间。所以它比way2
更快。如果你的way1
也使用for循环,速度也会下降;相应地,如果您在for循环中添加一些延迟,例如Main2
,则Thread.sleep(1000)
的差异会更小。但是,我认为way1
的测试数据仍然有点慢,在我的本地计算机上,邮件传输速度是每秒50,000+。
way2
这真的是一个很大的问题,你所做的只是方式,但你可能需要仔细设计你的演员以充分利用底层的线程池&amp;你还需要知道akka演员的运行机制,然后你可以在你的应用程序中强大的akka。