2016-06-04 7 views
0

Код:Ограничение Java Akka при использовании маршрутизатора?

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 одновременных заданий. На самом деле, как оптимизировать диспетчер по умолчанию для высокого одновременного приложения?

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"); 

ответ

0

Вы путаться между количеством актеров и диспетчерских нитей:

  • Количество участников в маршрутизаторе: это количество экземпляров, созданных в памяти, которая будет обрабатывать сообщения, приходящие к маршрутизатору следующий выбранный логика.

  • Потоки диспетчера: диспетчер - это пул потоков (или служба-исполнитель), который отвечает за управление потоками, чтобы получать сообщения из почтовых ящиков акторов и выполнять метод receive.

Максимальное количество одновременных задач, выполняемых в вашей системе, будет ограничено конфигурацией диспетчера. Наличие маршрутизаторов (и, следовательно, большего количества участников для обработки сообщений) позволит этим сообщениям обрабатываться одновременно потоками диспетчера.

я рекомендую прочитать больше о AKKA диспетчеров и, в частности, о диспетчеру по умолчанию: http://doc.akka.io/docs/akka/current/scala/dispatchers.html

+0

У меня вопрос, что параметр thinkput = 100 в application.conf , каково фактическое использование для использования 100 или 1? какое условие может использовать 1 или 100? Фактически, я не очень понимаю документ, так как нет никаких примеров действий для его объяснения. –

+0

Я не понимаю, что некоторые примеры задают thinkput = 100, как я могу его использовать? –

0

Ваш звонок Thread.sleep блокирует поток, поэтому у вас заканчиваются потоки. Если вы хотите увидеть все 100 из них, вы должны запустить блокирующие операции на своих собственных потоках.

+0

Ваш ответ не мои ожидания. : (... –

+0

Код внутри Thread.sleep должен использоваться для sim задания, для выполнения которого требуется много времени, поэтому я добавил его! –