2017-03-22 61 views
0

我嘗試使用akka.net做一個簡單的羣集。Akka.Net羣集簡單解釋

目標是讓服務器接收請求,並通過它的羣集akka.net處理它。

爲了測試和學習,我創建了一個接收數學方程的簡單WCF服務,並且我想發送這個方程來解決。

我有一個項目服務器和另一個客戶端。

在服務器端的配置是:

<![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://[email protected]:8081"] # address of seed node 
      } 

      } 
    ]]> 

在客戶端上的配置是這樣的:

<![CDATA[ 
     akka { 
      actor.provider = "Akka.Cluster.ClusterActorRefProvider, Akka.Cluster" 
      remote { 
       log-remote-lifecycle-events = DEBUG 
       log-received-messages = on 

       helios.tcp { 
        transport-class = "Akka.Remote.Transport.Helios.HeliosTcpTransport, Akka.Remote" 
            applied-adapters = [] 
            transport-protocol = tcp 
        port = 0 
        hostname = 127.0.0.1 
       } 
      } 
      cluster { 
       seed-nodes = ["akka.tcp://[email protected]:8081"] # address of the seed node 
       roles = ["math"] # roles this member is in 
      } 
      actor.deployment { 
       /math { 
       router = round-robin-pool # routing strategy 
       routees.paths = ["/user/math"] 
       nr-of-instances = 10 # max number of total routees 
       cluster { 
        enabled = on 
        allow-local-routees = on 
        use-role = math 
        max-nr-of-instances-per-node = 10 
       } 
       } 
      } 
      } 
    ]]> 

羣連接似乎正常進行。我看到狀態[UP]和與服務器端出現的「數學」角色的關聯。

事件依循WebCramler上的例子,我沒有達到讓消息傳遞。我總是得到一個死路。

我嘗試這樣的:

actor = sys.ActorOf(Props.Empty.WithRouter(FromConfig.Instance), "math"); 

var actor = sys.ActorSelection("/user/math"); 

是否有人知道一個很好的教程或能幫助我嗎? 感謝

回答

1

一些言論:

第一:假設從服務器到客戶端的發送工作。然後,您將有效地在您的客戶端上遠程部署角色。 這意味着只有服務器節點需要actor.deployment配置部分。 客戶端只需要默認的集羣配置(以及您的角色設置)。

第二:試着讓它變得更簡單。改爲使用round-robin-pool。它更簡單。試着讓它工作。並從那裏開始工作。 這種方式更容易消除配置/網絡/其他問題。

您的使用:actor = sys.ActorOf(Props.Empty.WithRouter(FromConfig.Instance), "math");是正確的。

round-robin-pool配置如何能夠看一個示例:

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:您創建每個請求一個新的路由器演員。不要這樣做。創建一次路由器角色,然後重新使用IActorRef
  • 擺脫MathAgentWorker項目中的最小羣集大小設置
  • 由於您未使用遠程actor部署。我將round-robin-pool更改爲round-robin-group

之後,它的工作。

還請記住,如果您使用consistent-hashing-group路由器,您需要指定散列密鑰。有很多種方法可以做到這一點,在我的例子中,我認爲最簡單的方法是將發送給路由器的消息打包爲ConsistentHashableEnvelope。查看文檔以獲取更多信息。

最後的阿卡部署部分是這樣的:

deployment { 
        /math { 
         router = round-robin-group # routing strategy 
         routees.paths = ["/user/math"] 
         cluster { 
          enabled = on 
          allow-local-routees = off 
          use-role = math 
         } 
        } 
        } 

在MathAgentWorker我只是改變了集羣節現在看起來是這樣的:

cluster { 
        seed-nodes = ["akka.tcp://[email protected]: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)); 
+0

我嘗試,它不工作更好。我實現的唯一方法是要求將領導者的地址集中在一個特定的角色上。但是這樣做我不會使用部署路由器的功能。 –

+0

示例項目:https://1drv.ms/u/s!AjjNROp1-dHyl7VVP7BI6uwl-cmSTQ –

+0

編輯我的答案,分享我的研究結果在您的示例項目。也。下次請使用不同的代碼共享機制,然後onedrive。 – Danthar