在群集路由中回复询问

时间:2015-08-24 14:39:47

标签: akka.net akka.net-cluster

我正在创建一个项目,此时有一个Actor(User)通过一致哈希组路由器调用另一个actor(Concert)。一切正常,但我的问题是,从演唱会演员我无法回答Ask消息。不知何故,消息丢失,客户端没有任何反应。我没有运气就尝试了一切:

  • Sender.Tell< - 创建一个时间?发送方
  • 在消息中通过引用传递User IActorRef并使用它。

以下是完整代码:https://github.com/pablocastilla/AkkaConcert

主要细节如下:

用户演员:

  <akka>
<hocon>
  <![CDATA[
                akka {
          actor {

                        provider = "Akka.Cluster.ClusterActorRefProvider, Akka.Cluster"
                        deployment {


                            /eventpool {
                                router = consistent-hashing-group
              routees.paths = ["/user/HugeEvent"]                                   
                                virtual-nodes-factor = 8
                                cluster {
                                        enabled = on
                                        max-nr-of-instances-per-node = 2
                                        allow-local-routees = off
                                        use-role = cluster
                                }
                            }                
                        }
                    }


                    remote {
                        log-remote-lifecycle-events = DEBUG

                        helios.tcp {
                            transport-class = "Akka.Remote.Transport.Helios.HeliosTcpTransport, Akka.Remote"
                            applied-adapters = []
                            transport-protocol = tcp
                            #will be populated with a dynamic host-name at runtime if left uncommented
                            #public-hostname = "POPULATE STATIC IP HERE"
                            hostname = "127.0.0.1"
                            port = 0
                        }
                    }            

                    cluster {
                        #will inject this node as a self-seed node at run-time
                        seed-nodes = ["akka.tcp://akkaconcert@127.0.0.1:8080"] #manually populate other seed nodes here, i.e. "akka.tcp://lighthouse@127.0.0.1:4053", "akka.tcp://lighthouse@127.0.0.1:4044"
                        roles = [client]
                        auto-down-unreachable-after = 60s
                    }
                }
        ]]>
</hocon>

客户端HOCON配置:

   private ActorSystem actorSystem;

    private IActorRef event1;

    public bool Start(HostControl hostControl)
    {
        actorSystem = ActorSystem.Create("akkaconcert");

        SqlServerPersistence.Init(actorSystem);

        event1 = actorSystem.ActorOf(
                Props.Create(() => new Concert(1,100000)), "HugeEvent");

        return true;
    }

在后端:

创建了演员

        private void ReadyCommands()
    {
        Command<GetAvailableSeats>(message => GetFreeSeatsHandler(message));

        Command<ReserveSeats>(message => ReserveSeatsHandler(message));

        Command<BuySeats>(message => Persist(message, BuySeatsHandler));


    }

    private bool GetFreeSeatsHandler(GetAvailableSeats message)
    {          

        var freeSeats = seats.Where(s => s.Value.State == Actors.Seat.SeatState.Free).Select(s2 => s2.Value).ToList();

        //1. Trying passing the user actor
        //message.User.Tell(new GetFreeSeatsResponse() { FreeSeats = freeSeats }, Context.Self);

        //2. Trying with the sender
        Context.Sender.Tell(new GetAvailableSeatsResponse() { FreeSeats = freeSeats }, Context.Self);


        printMessagesPerSecond(messagesReceived++);
        printfreeSeats(freeSeats);

        return true;
    }

音乐会演员消息处理

  <akka>
<hocon>
  <![CDATA[
                akka {
                    actor {
                        provider = "Akka.Cluster.ClusterActorRefProvider, Akka.Cluster"

                    }

                    remote {
                        log-remote-lifecycle-events = DEBUG

                        helios.tcp {
                            transport-class = "Akka.Remote.Transport.Helios.HeliosTcpTransport, Akka.Remote"
                            applied-adapters = []
                            transport-protocol = tcp
                            #will be populated with a dynamic host-name at runtime if left uncommented
                            #public-hostname = "POPULATE STATIC IP HERE"
                            hostname = "127.0.0.1"
                            port = 8080
                        }
                    }            

                    cluster {
                        #will inject this node as a self-seed node at run-time
                        seed-nodes = ["akka.tcp://akkaconcert@127.0.0.1:8080"] #manually populate other seed nodes here, i.e. "akka.tcp://lighthouse@127.0.0.1:4053", "akka.tcp://lighthouse@127.0.0.1:4044"
                        roles = [cluster]
                        auto-down-unreachable-after = 10s
                    }
                }
        ]]>
</hocon>

后端的HOCON配置:

topic

谢谢!

1 个答案:

答案 0 :(得分:3)

问题来自于邮件大小,邮件太大而且丢失了。

接收更大消息的配置:

akka {
helios.tcp {
    # Maximum frame size: 4 MB
    maximum-frame-size = 4000000b
}

}