从外面打电话给akka演员很慢

时间:2018-01-16 11:04:53

标签: java akka akka-cluster

我是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)。我需要解释,以及如何尽可能快地从演员外部拨打电话? 谢谢

1 个答案:

答案 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​​。