Cluster computing Net集群的简单解释

Cluster computing Net集群的简单解释,cluster-computing,akka.net,Cluster Computing,Akka.net,我尝试使用akka.net做一个简单的集群 目标是让服务器接收请求,并让akka.net通过it集群处理请求 为了测试和学习,我创建了一个简单的WCF服务,它接收一个数学方程,我想发送这个方程来求解 我有一个project server和另一个客户端 服务器端的配置为: <![CDATA[ akka { actor { provider = "Akka.Cluster.ClusterActorRefProvider, Akka

我尝试使用akka.net做一个简单的集群

目标是让服务器接收请求,并让akka.net通过it集群处理请求

为了测试和学习,我创建了一个简单的WCF服务,它接收一个数学方程,我想发送这个方程来求解

我有一个project server和另一个客户端

服务器端的配置为:

<![CDATA[
      akka {
            actor {
              provider = "Akka.Cluster.ClusterActorRefProvider, Akka.Cluster"
              debug {
                receive = on
                autoreceive = on
                lifecycle = on
                event-stream = on
                unhandled = on
              }
              deployment {
                /math {
                  router = consistent-hashing-group #round-robin-pool # routing strategy
                  routees.paths = [ "/user/math" ]
                  virtual-nodes-factor = 8
                  #nr-of-instances = 10 # max number of total routees
                  cluster {
                     enabled = on
                                           max-nr-of-instances-per-node = 2
                                           allow-local-routees = off
                                           use-role = math
                  }
                }
              }
            }
            remote {
                helios.tcp {
                    transport-class = "Akka.Remote.Transport.Helios.HeliosTcpTransport, Akka.Remote"
                                    applied-adapters = []
                                    transport-protocol = tcp
                    port = 8081
                    hostname = "127.0.0.1"
                }
            }
          cluster {
              seed-nodes = ["akka.tcp://ClusterSystem@127.0.0.1:8081"] # address of seed node
             }

          }
  ]]>

有人知道一个好的教程或者可以帮助我吗? 谢谢

一些评论:

第一:假设您将工作从服务器发送到客户端。然后,您就可以在客户端上有效地远程部署参与者。 这意味着只有服务器节点需要
actor.deployment
config部分。 客户端只需要默认的集群配置(当然还有您的角色设置)

第二:先让它简单一些。改为使用循环池。这要简单得多。试着让它工作起来。然后从那里一路爬上去。 这样更容易消除配置/网络/其他问题

您的用法:
actor=sys.ActorOf(Props.Empty.WithRouter(FromConfig.Instance),“math”)是正确的

您的
循环池
配置的示例:

deployment {
                /math {
                  router = round-robin-pool # routing strategy
                  nr-of-instances = 10 # max number of total routees
                  cluster {
                     enabled = on
                     max-nr-of-instances-per-node = 2
                     allow-local-routees = off
                     use-role = math
                  }
                }
              }
试试这个。如果有帮助,请告诉我

编辑:

看了你的样品后,好的。有些事情我改变了

  • ActorManager->Process
    :为每个请求创建一个新的路由器参与者。不要那样做。创建router actor一次,然后重用
    IActorRef
  • 取消了
    MathAgentWorker
    项目中的最小集群大小设置
  • 因为您没有使用远程参与者部署。我将
    循环池
    更改为
    循环组
在那之后,它起了作用

还要记住,如果您使用
一致散列组
路由器,则需要指定散列密钥。有多种方法可以做到这一点,在您的示例中,我认为最简单的方法是将发送到路由器的消息封装在一个一致的hashable信封中。查看文档以了解更多信息

最后,akka部署部分如下所示:

deployment {
                    /math {
                        router = round-robin-group # routing strategy
                        routees.paths = ["/user/math"]
                        cluster {
                           enabled = on
                           allow-local-routees = off
                           use-role = math
                        }
                     }
                  }
cluster {
                  seed-nodes = ["akka.tcp://ClusterSystem@127.0.0.1:8081"] # address of the seed node
                  roles = ["math"] # roles this member is in
                 }
在MathAgentWorker上,我只更改了cluster部分,该部分现在如下所示:

deployment {
                    /math {
                        router = round-robin-group # routing strategy
                        routees.paths = ["/user/math"]
                        cluster {
                           enabled = on
                           allow-local-routees = off
                           use-role = math
                        }
                     }
                  }
cluster {
                  seed-nodes = ["akka.tcp://ClusterSystem@127.0.0.1:8081"] # address of the seed node
                  roles = ["math"] # roles this member is in
                 }
ActorManager.Process
所做的唯一事情是:

 return await Program.Instance.RouterInstance.Ask<TResult>(msg, TimeSpan.FromSeconds(10));
return wait Program.Instance.RouterInstance.Ask(msg,TimeSpan.FromSeconds(10));

我尝试过,但效果并不好。我实现的唯一方法是要求为某个特定角色聚集领导角色的地址。但这样做,我不使用部署,也不使用路由器电源。编辑我的答案,分享我对您的示例项目的发现。也。下次请使用与onedrive不同的代码共享机制。非常感谢,主要问题是循环池与循环组
 return await Program.Instance.RouterInstance.Ask<TResult>(msg, TimeSpan.FromSeconds(10));