Error al utilizar akka remotamente con arteria en lugar de acopladores

Antes que nada, perdón por mi inglés. El traductor de Google me ayuda mucho, jaja.

Mi problema es este:

Tengo dos proyectos de ejemplo desarrollados con akka y java : example-remote-client.jar y example-remote-server.jar

Estoy usando la serialization de las arterias y estoy tratando de enviar posts de cliente a server a través de akka-remoting.

El actor cliente que hace eso es:

 public class ClientActor extends AbstractActor { public static Props props() { return Props.create(ClientActor.class); } public ClientActor() { ActorSelection selection = getContext().system().actorSelection("akka://server@localhost:5001/user/server-process"); selection.tell(new MessageRequest(), getSelf()); } public Receive createReceive() { return receiveBuilder().match(MessageResponse.class, msg -> { System.out.println(msg.getMessage()); }).build(); } } 

La configuration de mi cliente:

 akka { loglevel = "DEBUG" actor { provider = remote allow-java-serialization = off serializers { java = "akka.serialization.JavaSerializer" myown = "serializers.ExampleByteBufSerializer" } serialization-bindings { "java.lang.String" = myown "protocol.MessageRequest" = myown "protocol.MessageResponse" = myown "java.lang.Boolean" = myown } } remote { artery { enabled = on canonical.hostname = "192.168.0.250" # external (logical) hostname canonical.port = 5000 # external (logical) port bind.hostname = "localhost" # internal (bind) hostname bind.port = 10000 # internal (bind) port } } } 

El actor del server es muy tonto, no creo que sea necesario pegarlo aquí. Pero su configuration es:

 akka { loglevel = "DEBUG" actor { provider = remote allow-java-serialization = off serializers { java = "akka.serialization.JavaSerializer" myown = "serializers.ExampleByteBufSerializer" } serialization-bindings { "java.lang.String" = myown "protocol.MessageRequest" = myown "protocol.MessageResponse" = myown "java.lang.Boolean" = myown } } remote { artery { enabled = on canonical.hostname = "192.168.0.250" # external (logical) hostname canonical.port = 5001 # external (logical) port bind.hostname = "localhost" # internal (bind) hostname bind.port = 10001 # internal (bind) port } } } 

Ambos jar se implementan en instancias de acopladores que se ejecutan en la misma "máquina 192.168.0.250", como se ve a continuación:

 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d2970bd20371 openjdk:alpine "sh" 34 minutes ago Up 34 minutes 0.0.0.0:5001->10001/tcp ex-remoting-server 36a67fea8590 openjdk:alpine "sh" 34 minutes ago Up 34 minutes 0.0.0.0:5000->10000/tcp ex-remoting-client 

El server comienza bien, con el siguiente logging:

 [DEBUG] [07/04/2017 13:46:18.473] [main] [EventStream(akka://server)] logger log1-Logging$DefaultLogger started [DEBUG] [07/04/2017 13:46:18.473] [main] [EventStream(akka://server)] Default Loggers started [DEBUG] [07/04/2017 13:46:18.495] [main] [akka.serialization.Serialization(akka://server)] Replacing JavaSerializer with DisabledJavaSerializer, due to `akka.actor.allow-java-serialization = off`. [INFO] [07/04/2017 13:46:18.628] [main] [akka.remote.artery.ArteryTransport(akka://server)] Started embedded media driver in directory [/dev/shm/aeron-root-server-efd42dec-452d-406c-8d1d-807e0d8ff7fc] [INFO] [07/04/2017 13:46:18.693] [main] [akka.remote.artery.ArteryTransport(akka://server)] Remoting started; listening on address: [akka://server@192.168.0.250:5001] with UID [-2663186266051514585] 

Pero cuando trato de iniciar el cliente, aparece el siguiente error:

 [ERROR] [07/04/2017 14:09:05.250] [client-akka.actor.default-dispatcher-10] [akka://server@192.168.0.250:5001/] swallowing exception during message send io.aeron.exceptions.RegistrationException: Insufficient usable storage for new log of length=50332096 in /dev/shm (shm) at io.aeron.ClientConductor.onError(ClientConductor.java:285) at io.aeron.DriverListenerAdapter.onMessage(DriverListenerAdapter.java:79) at org.agrona.concurrent.broadcast.CopyBroadcastReceiver.receive(CopyBroadcastReceiver.java:100) at io.aeron.DriverListenerAdapter.pollMessage(DriverListenerAdapter.java:59) at io.aeron.ClientConductor.doWork(ClientConductor.java:422) at io.aeron.ClientConductor.awaitResponse(ClientConductor.java:447) at io.aeron.ClientConductor.addPublication(ClientConductor.java:177) at io.aeron.Aeron.addPublication(Aeron.java:165) at akka.remote.artery.AeronSink$$anon$1.<init>(AeronSink.scala:103) at akka.remote.artery.AeronSink.createLogicAndMaterializedValue(AeronSink.scala:100) at akka.stream.impl.GraphStageIsland.materializeAtomic(PhasedFusingActorMaterializer.scala:627) at akka.stream.impl.PhasedFusingActorMaterializer.materialize(PhasedFusingActorMaterializer.scala:458) at akka.stream.impl.PhasedFusingActorMaterializer.materialize(PhasedFusingActorMaterializer.scala:420) at akka.stream.impl.PhasedFusingActorMaterializer.materialize(PhasedFusingActorMaterializer.scala:415) at akka.stream.scaladsl.RunnableGraph.run(Flow.scala:439) at akka.remote.artery.Association.akka$remote$artery$Association$$runOutboundOrdinaryMessagesStream(Association.scala:570) at akka.remote.artery.Association.runOutboundStreams(Association.scala:510) at akka.remote.artery.Association.associate(Association.scala:502) at akka.remote.artery.AssociationRegistry.association(Association.scala:763) at akka.remote.artery.ArteryTransport.association(ArteryTransport.scala:932) at akka.remote.artery.ArteryTransport.send(ArteryTransport.scala:918) at akka.remote.RemoteActorRef.$bang(RemoteActorRefProvider.scala:563) at akka.actor.ActorRef.tell(ActorRef.scala:124) at akka.actor.ActorSelection$.rec$1(ActorSelection.scala:250) at akka.actor.ActorSelection$.deliverSelection(ActorSelection.scala:254) at akka.actor.ActorSelection.tell(ActorSelection.scala:45) at actors.ClientActor.<init>(ClientActor.java:21) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at java.lang.Class.newInstance(Class.java:442) at akka.util.Reflect$.instantiate(Reflect.scala:44) at akka.actor.NoArgsReflectConstructor.produce(IndirectActorProducer.scala:105) at akka.actor.Props.newActor(Props.scala:213) at akka.actor.ActorCell.newActor(ActorCell.scala:563) at akka.actor.ActorCell.create(ActorCell.scala:589) at akka.actor.ActorCell.invokeAll$1(ActorCell.scala:462) at akka.actor.ActorCell.systemInvoke(ActorCell.scala:484) at akka.dispatch.Mailbox.processAllSystemMessages(Mailbox.scala:282) at akka.dispatch.Mailbox.run(Mailbox.scala:223) at akka.dispatch.Mailbox.exec(Mailbox.scala:234) at akka.dispatch.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) at akka.dispatch.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) at akka.dispatch.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) at akka.dispatch.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) 

También trato de enviar posts con estas "routes ActorSelection":

"akka: //server@192.168.0.250: 5001 / user / server-process" "akka: // server @ localhost: 5001 / user / server-process" "akka: //server@192.168.0.250: 10001 / user / server-process "" akka: // server @ localhost: 10001 / user / server-process "

pero el error aún aparece.

Es importante aclarar, también, que la ruta del actor del server es:

akka: // server / usuario / process del server

¿Lo que falta? Estoy usando una versión de Akka 2.5.3 …

Gracias.

No estoy muy seguro de cómo funciona Akka canonical vs bind direccionamiento. Pero mi suposition es que bind.hostname es la dirección IP real o resuelta por el nombre de host que escuchará. En este caso, localhost traduce a 127.0.0.1 , lo que significa que el contenedor solo aceptará conexiones en 127.0.0.1 .

Intenta configurar el bind.hostname a 0.0.0.0 . Esto permitirá conexiones desde direcciones IP fuera del contenedor (desde el host a través del puerto 5001).

Intente configurar el tamaño de su volumen /dev/shm para que sea más grande. En un file docker-compose, simplemente puede agregar esta opción: shm_size: 500M . Este volumen es un espacio de memory compartida que aeron usa para almacenar los posts.