【问题标题】:Java Akka concurrent limitation in using router?Java Akka 使用路由器的并发限制?
【发布时间】:2016-10-04 13:54:20
【问题描述】:

代码是:

public class TestAkka {

    public static void main(String[] args) throws InterruptedException {

        ActorSystem system = ActorSystem.create("ExampleRouter", ConfigFactory.load().getConfig("MyRouter"));
        ActorRef router = system.actorOf(Props.create(Hello.class).withRouter(new FromConfig()), "exampleRouter");

        for (int i = 0; i < 100; i++) {
            router.tell(new Website().getNameByIndex(i), router);
        }
    }

    public static class Hello extends UntypedActor {

        @Override
        public void onReceive(Object message) throws Exception {
            if (message instanceof String) {
                System.out.println("Hello " + message);
                URL url = new URL("http://" + message + ":80");
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                System.out.println(conn.getResponseCode());
                Thread.sleep(10000);  // <-- Sim the job take a short time
            } else {
                unhandled(message);
            }
        }
    }
}

application.conf 是:

MyRouter{
    akka {
        actor {
            deployment {
                /exampleRouter {
                    router = round-robin-pool
                    nr-of-instances = 100
                }
            }
        }
    }
}

结果是每次只能看到 8 个并发作业在运行,但我的期望是 100 个并发作业应该同时运行!还需要设置吗?

2016/06/06 更新: 我已经修改了我的代码,结果是我期望覆盖了 application.conf,它现在可以同时运行 100 个并发作业。实际上,如何针对高并发应用优化 default-dispatcher?

String s = ""
        + "akka {\n"
        + "    actor {\n"
        + "        deployment {\n"
        + "            /router {\n"
        + "                router = round-robin-pool\n"
        + "                nr-of-instances = 10000\n"
        + "            }\n"
        + "        }\n"
        + "        default-dispatcher {\n"
        + "            fork-join-executor {\n"
        + "                parallelism-min = 200\n"
        + "                parallelism-max = 5000\n"
        + "            }\n"
        + "        }\n"
        + "    }\n"
        + "}\n";
ActorSystem as = ActorSystem.create("as", ConfigFactory.parseString(s));
ActorRef ar = as.actorOf(Props.create(Hello.class).withRouter(new FromConfig()), "router");

【问题讨论】:

    标签: java asynchronous concurrency akka akka-cluster


    【解决方案1】:

    您对参与者数量和调度程序线程的数量感到困惑:

    • 路由器中的参与者数量:它是在内存中创建的实例的数量,这些实例将按照选定的逻辑处理到达路由器的消息。

    • 调度程序线程:调度程序是一个线程池(或执行器服务),负责管理线程以从参与者邮箱中获取消息并执行receive 方法。

    系统中发生的最大并发任务数将受调度程序配置的限制。拥有路由器(因此有更多的参与者来处理消息)将使这些消息由调度程序中的线程同时处理。

    我建议阅读有关 akka 调度程序的更多信息,尤其是有关默认调度程序的信息:http://doc.akka.io/docs/akka/current/scala/dispatchers.html

    【讨论】:

    • 我有个疑问,application.conf中的参数thinkput=100,实际使用100还是1有什么用?什么条件可以使用1或100?事实上,我对文档不是很了解,因为没有实际的例子来解释它。
    • 我不明白有些例子设置了thoughtput=100,我该如何使用它?
    【解决方案2】:

    您对Thread.sleep 的调用阻塞了线程,因此您的线程用完了。如果您想查看全部 100 个,您应该在它们自己的专用线程上运行阻塞操作。

    【讨论】:

    • Thread.sleep里面的代码是用来模拟需要很长时间执行的作业,所以才加上!!
    猜你喜欢
    • 2014-02-28
    • 2017-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多