2015-01-17 4 views
5

Я испытываю функцию akka remote для инструмента, который я создаю. Фактически, я смог сделать основные и удаленные системы работать на одном хосте с разными портами. Обратите внимание, что мои удаленные серверы работают через маршрутизатор, как описано в документах akka.Akka удаленные маршруты проблема с именем хоста

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

Приложение ядро ​​имеет следующую конфигурацию (я изменил имена некоторых из соображений безопасности):

akka.actor.deployment { 
    /querierActor/querierPool { 
    router = round-robin-pool 
    nr-of-instances = 12 
    target.nodes = [ 
     "akka.tcp://[email protected]:2560" 
     ,"akka.tcp://[email protected]:2560" 
     ,"akka.tcp://[email protected]:2560" 

    ] 
    } 
} 

// remote configuration. Use it for multiple machines calculation 
akka { 
    actor { 
    provider = "akka.remote.RemoteActorRefProvider" 
    } 
    remote { 
    enabled-transports = ["akka.remote.netty.tcp"] 
    netty.tcp { 
     maximum-frame-size = 100MiB 
     port = 2552 
     hostname = "0.0.0.0" 
    } 
    } 
} 

Хотя удаленных хостов имеет следующую конфигурацию:

akka.actor.deployment { 
    /querierActor/querierPool { 
    router = balancing-pool 
    nr-of-instances = 15 
    } 
} 

akka { 
    actor { 
    provider = "akka.remote.RemoteActorRefProvider" 
    } 
    remote { 
    enabled-transports = ["akka.remote.netty.tcp"] 
    netty.tcp { 
     maximum-frame-size = 100MiB 
     hostname = "0.0.0.0" 
     port = 2560 
    } 
    } 
} 

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

[ERROR] [01/17/2015 12:55:05.734] [SYSTEM-akka.remote.default-remote-dispatcher-16] [akka.tcp://[email protected]:2560/system/endpointManager/reliableEndpointWriter-akka.tcp%3A%2F%2FSYSTEM%400.0.0.0%3A2552-0/endpointWriter] dropping message [class akka.actor.ActorSelectionMessage] for non-local recipient [Actor[akka.tcp://[email protected]:2560/]] arriving at [akka.tcp://[email protected]:2560] inbound addresses are [akka.tcp://[email protected]:2560] 

И после этого сервер и удаленный хост начинает регистрировать ошибку и блокировать. Ошибка

Сервер:

[WARN] [01/17/2015 12:21:05.658] [CRAWLER-LD-akka.remote.default-remote-dispatcher-7] [akka.tcp://[email protected]:2552/system/remote-watcher] Detected unreachable: [akka.tcp://[email protected]:2560] 
[WARN] [01/17/2015 12:21:05.664] [SYSTEM-akka.remote.default-remote-dispatcher-17] [Remoting] Association to [akka.tcp://[email protected]:2560] with unknown UID is reported as quarantined, but address cannot be quarantined without knowing the UID, gating instead for 5000 ms. 

(...) 

[INFO] [01/17/2015 12:21:05.712] [SYSTEM-akka.actor.default-dispatcher-6] [akka://SYSTEM/user/querierActor/querierPool] Message [akka.dispatch.sysmsg.DeathWatchNotification] from Actor[akka://SYSTEM/user/querierActor/querierPool#-1217916605] to Actor[akka://SYSTEM/user/querierActor/querierPool#-1217916605] was not delivered. [1] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'. 

(...) 

Удаленная ошибка (аналогичные линии в несколько раз):

(...) 
[ERROR] [01/17/2015 14:21:16.371] [SYSTEM-akka.remote.default-remote-dispatcher-16] [akka.tcp://[email protected]:2560/system/endpointManager/reliableEndpointWriter-akka.tcp%3A%2F%2FSYSTEM%400.0.0.0%3A2552-2/endpointWriter] dropping message [class akka.actor.ActorSelectionMessage] for non-local recipient [Actor[akka.tcp://[email protected]:2560/]] arriving at [akka.tcp://[email protected]:2560] inbound addresses are [akka.tcp://[email protected]:2560] 
[ERROR] [01/17/2015 14:21:17.388] [SYSTEM-akka.remote.default-remote-dispatcher-16] [akka.tcp://[email protected]:2560/system/endpointManager/reliableEndpointWriter-akka.tcp%3A%2F%2FSYSTEM%400.0.0.0%3A2552-2/endpointWriter] dropping message [class akka.actor.ActorSelectionMessage] for non-local recipient [Actor[akka.tcp://[email protected]:2560/]] arriving at [akka.tcp://[email protected]:2560] inbound addresses are [akka.tcp://[email protected]:2560] 
[WARN] [01/17/2015 14:21:17.465] [SYSTEM-akka.remote.default-remote-dispatcher-16] [akka.tcp://[email protected]:2560/system/endpointManager/reliableEndpointWriter-akka.tcp%3A%2F%2FSYSTEM%400.0.0.0%3A2552-2] Association with remote system [akka.tcp://[email protected]:2552] has failed, address is now gated for [5000] ms. Reason is: [Disassociated]. 
[INFO] [01/17/2015 14:21:17.467] [SYSTEM-akka.actor.default-dispatcher-21] [akka://SYSTEM/system/transports/akkaprotocolmanager.tcp0/akkaProtocol-tcp%3A%2F%2FSYSTEM%40186.228.120.115%3A56044-3] Message [akka.remote.transport.AssociationHandle$Disassociated] from Actor[akka://SYSTEM/deadLetters] to Actor[akka://SYSTEM/system/transports/akkaprotocolmanager.tcp0/akkaProtocol-tcp%3A%2F%2FSYSTEM%40186.228.120.115%3A56044-3#-2070785548] was not delivered. [6] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'. 
[INFO] [01/17/2015 14:21:17.468] [SYSTEM-akka.actor.default-dispatcher-21] [akka://SYSTEM/system/transports/akkaprotocolmanager.tcp0/akkaProtocol-tcp%3A%2F%2FSYSTEM%40186.228.120.115%3A56044-3] Message [akka.remote.transport.ActorTransportAdapter$DisassociateUnderlying] from Actor[akka://SYSTEM/deadLetters] to Actor[akka://SYSTEM/system/transports/akkaprotocolmanager.tcp0/akkaProtocol-tcp%3A%2F%2FSYSTEM%40186.228.120.115%3A56044-3#-2070785548] was not delivered. [7] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'. 

(...) 

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

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'FacadeMemory' defined in file [D:\data\development\git\semantic-web-crawler\crawlerld.core\target\classes\net\dovale\websemantics\linkedDataRecommender\facade\memory\FacadeMemory.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [facade.memory.FacadeMemory]: Constructor threw exception; nested exception is org.jboss.netty.channel.ChannelException: Failed to bind to: /remote-srv01.cloudapp.net:2560 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1077) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1022) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:706) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:762) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:109) 
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:691) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:320) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:952) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:941) 
    at facade.memory.GUIMain.main(GUIMain.java:23) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134) 
Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [facade.memory.FacadeMemory]: Constructor threw exception; nested exception is org.jboss.netty.channel.ChannelException: Failed to bind to: /remote-srv01.cloudapp.net:2560 
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:164) 
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:89) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1070) 
    ... 21 more 
Caused by: org.jboss.netty.channel.ChannelException: Failed to bind to: /remote-srv01.cloudapp.net:2560 
    at org.jboss.netty.bootstrap.ServerBootstrap.bind(ServerBootstrap.java:272) 
    at akka.remote.transport.netty.NettyTransport$$anonfun$listen$1.apply(NettyTransport.scala:393) 
    at akka.remote.transport.netty.NettyTransport$$anonfun$listen$1.apply(NettyTransport.scala:389) 
    at scala.util.Success$$anonfun$map$1.apply(Try.scala:236) 
    at scala.util.Try$.apply(Try.scala:191) 
    at scala.util.Success.map(Try.scala:236) 
    at scala.concurrent.Future$$anonfun$map$1.apply(Future.scala:235) 
    at scala.concurrent.Future$$anonfun$map$1.apply(Future.scala:235) 
    at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32) 
    at akka.dispatch.BatchingExecutor$Batch$$anonfun$run$1.processBatch$1(BatchingExecutor.scala:67) 
    at akka.dispatch.BatchingExecutor$Batch$$anonfun$run$1.apply$mcV$sp(BatchingExecutor.scala:82) 
    at akka.dispatch.BatchingExecutor$Batch$$anonfun$run$1.apply(BatchingExecutor.scala:59) 
    at akka.dispatch.BatchingExecutor$Batch$$anonfun$run$1.apply(BatchingExecutor.scala:59) 
    at scala.concurrent.BlockContext$.withBlockContext(BlockContext.scala:72) 
    at akka.dispatch.BatchingExecutor$Batch.run(BatchingExecutor.scala:58) 
    at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:41) 
    at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:401) 
    at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) 
    at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) 
    at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) 
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) 
Caused by: java.net.BindException: Cannot assign requested address: bind 
    at sun.nio.ch.Net.bind0(Native Method) 
    at sun.nio.ch.Net.bind(Net.java:436) 
    at sun.nio.ch.Net.bind(Net.java:428) 
    at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:214) 
    at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74) 
    at org.jboss.netty.channel.socket.nio.NioServerBoss$RegisterTask.run(NioServerBoss.java:193) 
    at org.jboss.netty.channel.socket.nio.AbstractNioSelector.processTaskQueue(AbstractNioSelector.java:372) 
    at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:296) 
    at org.jboss.netty.channel.socket.nio.NioServerBoss.run(NioServerBoss.java:42) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 

Я не знаю, что я делаю неправильно. Я попытался найти информацию о проблеме, но все, что я нашел, связано с моей проблемой. Я также открыл порты в лазурной конфигурации.

Как я могу позволить хосту моего сервера правильно общаться с удаленными хостами?

ответ

5

Я смог решить проблему.

После некоторых бесплодных исследований мне пришлось попробовать разные вещи. Я делаю некоторые предположения, которые могут быть неправильными, поскольку я не нашел никакой другой информации. Если вы читаете этот ответ и находите какую-либо ошибку, сообщите мне об этом.

Проблема заключалась в том, что структура (sun.nio.ch.Net.bind0, по-видимому, но я не нашел много документов об этом) допускает следующий диапазон ips: 0.0.0.0 (в случае, если вы принимаете соединения из любой сетевой интерфейс в машине), 127.0.0.0 (в случае, если вы работаете только с локальным запросом - гостем) и IP-адресом любого сетевого интерфейса компьютера. В этом последнем случае запросы будут разрешены только для этого конкретного интерфейса.

Проблема в том, что свойство «hostname» также используется для адресации удаленных узлов Akka. Я имею в виду, что когда узел узла вызывает удаленный узел, он использует эту информацию для идентификации, после чего результат должен быть отправлен. Кроме того, если вы поместите свойство hostname со значением 0.0.0.0 и попытаетесь достичь этого узла по имени dns (которое не может быть связано с каким-либо сетевым интерфейсом), оно не удастся. Вы должны идентифицировать машину с тем же IP-адресом, что и один из сетевых интерфейсов.

Итак, моя установка немного изменилась:

Для принимающего узла, я сделал это изменение:

(...) 
akka.actor.deployment { 
    /sparqlQuerierMasterActor/sparqlQuerierPool { 
    router = round-robin-pool 
    nr-of-instances = 12 
    target.nodes = [ 
     "akka.tcp://[email protected]:2560" 
     ,"akka.tcp://[email protected]:2560" 
     ,"akka.tcp://[email protected]:2560" 

    ] 
    } 
} 
(...) 

XXX, YYY и ZZZ достижимы IP-адреса удаленных узлов, которые также зарегистрированы в сети интерфейс.

Конфигурация удаленного узла изменяется на:

(...) 
    remote { 
    enabled-transports = ["akka.remote.netty.tcp"] 
    netty.tcp { 
     maximum-frame-size = 100MiB 
     hostname = "YYY.YYY.YYY.YYY" 
     port = 2560 
    } 
    } 
(...) 

Я не проверить его можно сохранить предыдущую конфигурацию 0.0.0.0. Возможно, это возможно.

Это решение позволило мне сделать удаленные узлы удаленным и удаленным узлом, чтобы он был бесполезным. =)

Смежные вопросы