5

作成中のツールで akka リモート機能を使用しています。実際、コア システムとリモート システムを異なるポートを持つ同じホストで動作させることができました。akka docs で説明されているように、私のリモートサーバーはルーター上で実行されていることに注意してください。

現在、より良い実験を行うためにいくつかの Azure 仮想マシンを使用しようとしていますが、いくつかの問題が発生しています。

コア アプリケーションの構成は次のとおりです (セキュリティ上の理由から一部の名前を変更しました)。

akka.actor.deployment {
  /querierActor/querierPool {
    router = round-robin-pool
    nr-of-instances = 12
    target.nodes = [
       "akka.tcp://SYSTEM@remote-srv01.cloudapp.net:2560"
      ,"akka.tcp://SYSTEM@remote-srv02.cloudapp.net:2560"
      ,"akka.tcp://SYSTEM@remote-srv03.cloudapp.net: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://SYSTEM@0.0.0.0: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://SYSTEM@remote-srv01.cloudapp.net:2560/]] arriving at [akka.tcp://SYSTEM@remote-srv01.cloudapp.net:2560] inbound addresses are [akka.tcp://SYSTEM@0.0.0.0:2560]

そしてしばらくすると、サーバーとリモートホストがエラーをログに記録し始め、フリーズします。

サーバーエラー:

[WARN] [01/17/2015 12:21:05.658] [CRAWLER-LD-akka.remote.default-remote-dispatcher-7] [akka.tcp://SYSTEM@0.0.0.0:2552/system/remote-watcher] Detected unreachable: [akka.tcp://SYSTEM@remote-srv01.cloudapp.net:2560]
[WARN] [01/17/2015 12:21:05.664] [SYSTEM-akka.remote.default-remote-dispatcher-17] [Remoting] Association to [akka.tcp://SYSTEM@remote-srv01.cloudapp.net: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://SYSTEM@0.0.0.0: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://SYSTEM@remote-srv01.cloudapp.net:2560/]] arriving at [akka.tcp://SYSTEM@remote-srv01.cloudapp.net:2560] inbound addresses are [akka.tcp://SYSTEM@0.0.0.0:2560]
[ERROR] [01/17/2015 14:21:17.388] [SYSTEM-akka.remote.default-remote-dispatcher-16] [akka.tcp://SYSTEM@0.0.0.0: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://SYSTEM@remote-srv01.cloudapp.net:2560/]] arriving at [akka.tcp://SYSTEM@remote-srv01.cloudapp.net:2560] inbound addresses are [akka.tcp://SYSTEM@0.0.0.0:2560]
[WARN] [01/17/2015 14:21:17.465] [SYSTEM-akka.remote.default-remote-dispatcher-16] [akka.tcp://SYSTEM@0.0.0.0:2560/system/endpointManager/reliableEndpointWriter-akka.tcp%3A%2F%2FSYSTEM%400.0.0.0%3A2552-2] Association with remote system [akka.tcp://SYSTEM@0.0.0.0: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)

何が間違っているのかわかりません。この問題に関する情報を検索しようとしましたが、見つかった情報はいずれも私の問題に関連しています。Azure構成でもポートを開きました。

サーバー ホストがリモート ホストと適切に通信できるようにするにはどうすればよいですか?

4

1 に答える 1

5

問題に対処できました。

いくつかの無駄な研究の後、私はいくつかの異なることを試みなければなりませんでした. 他の情報が見つからなかったので、間違っている可能性があるいくつかの仮定を立てています。この回答を読んでエラーを見つけた場合は、お知らせください。

問題は、フレームワーク (sun.nio.ch.Net.bind0 のようですが、それに関するドキュメントはあまり見つかりませんでした) が次の範囲の ips を許可することでした: 0.0.0.0 (任意のネットワーク インターフェイスからの接続を受け入れる場合)マシン)、127.0.0.0(ローカルリクエストのみで作業する場合-Iゲスト)、およびコンピューターのネットワークインターフェイスのIPアドレス。この最後のケースでは、リクエストはこの特定のインターフェースに対してのみ許可されます。

問題は、「ホスト名」プロパティが Akka のリモート ノードのアドレス指定にも使用されることです。つまり、ホスト ノードがリモート ノードを呼び出すと、この情報を使用して、終了後に結果を送信する必要があるかどうかを識別します。また、プロパティー hostname に値 0.0.0.0 を設定し、その dns 名 (どのネットワーク・インターフェースにも関連付けることができなかった) でこのノードに到達しようとすると、失敗します。ネットワーク インターフェイスの 1 つと同じ IP を持つマシンを識別する必要があります。

だから、私のセットアップはわずかに変更されました:

ホスト ノードについては、次の変更を行いました。

(...)
akka.actor.deployment {
  /sparqlQuerierMasterActor/sparqlQuerierPool {
    router = round-robin-pool
    nr-of-instances = 12
    target.nodes = [
       "akka.tcp://SYSTEM@XXX.XXX.XXX.XXX:2560"
      ,"akka.tcp://SYSTEM@YYY.YYY.YYY.YYY:2560"
      ,"akka.tcp://SYSTEM@ZZZ.ZZZ.ZZZ.ZZZ: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 構成を維持できるかどうかはテストしていません。多分それは可能です。

このソリューションにより、ホスト ノードとリモート ノードが問題なく通信できるようになりました =)

于 2015-01-20T00:22:15.207 に答える