11

私がやりたいことは次のとおりです。

1) 10 台の異なるマシンで 10 個のリモート アクターを動的に作成できるサーバー上にマスター アクターを作成する

2) マスター アクターが 10 人のリモート アクターにタスクを分配する

3) すべてのリモート アクターが作業を終了すると、結果をマスター アクターに送信します。

4) マスター アクターがシステム全体をシャットダウンする

私の問題は次のとおりです。

1) マスター アクターの設定方法がわかりません。以下は私のサーバー パーツ コードです。

class MasterAppliation extends Bootable{
    val hostname = InetAddress.getLocalHost.getHostName
    val config = ConfigFactory.parseString(
          s"""
            akka{
            actor{
                provider = "akka.remote.RemoteActorRefProvider"
                deployment {
                    /remotemaster {
                        router = "round-robin"
                        nr-of-instances = 10
                        target {
                            nodes = ["akka.tcp://remotesys@host1:2552", "akka.tcp://remotesys@host2:2552", ....... akka.tcp://remotesys@host10:2552"]
                        }
                }
            }
            remote{
                enabled-transports = ["akka.remote.netty.tcp"]
                netty.tcp{
                hostname = "$hostname"
                port = 2552
                }
            }     
          }""")

    val system = ActorSystem("master", ConfigFactory.load(config))        
    val master = system.actorOf(Props(new master), name = "master") 
    def dosomething = master ! Begin()
    def startup() {}
    def shutdown() {
        system.shutdown()
    }
}

class master extends Actor {   
   val addresses = for(i <- 1 to 10) 
       yield AddressFromURIString(s"akka://remostsys@host$i:2552")

   val routerRemote = context.actorOf(Props[RemoteMaster].withRouter(
           RemoteRouterConfig(RoundRobinRouter(12), addresses)))

   def receive = {
     case Begin=>{
       for(i <- 1 to 10) routerRemote ! Work(.....)     
     }
     case Result(root) ........      
   }
}


object project1 {
  def main(args: Array[String]) {                
    new MasterAppliation
  }
}

2) リモート クライアントでリモート アクターを作成する方法がわかりません。このチュートリアルを読み ました。サーバー部分と同様にクライアント部分を作成する必要がありますか? つまり、リモート アクターの作成を担当するオブジェクトを作成する必要がありますか? しかし、これは、クライアント部分を実行すると、リモート アクターが既に作成されていることも意味します。私は本当に混乱しています。

3) システム全体をシャットダウンする方法がわかりません。上記のチュートリアルでは、shutdown() という名前の関数があることがわかりましたが、誰もそれを呼び出していません。

Scala と AKKA で分散プログラムを作成するのはこれが初めてです。だから私は本当にあなたの助けが必要です。どうもありがとう。

4

1 に答える 1

6

初めて全体をセットアップするのは面倒ですが、一度セットアップすれば、定期的に使用できる優れたスケルトンが作成されます。

ユーザー クラスタリングがリモート処理ではないという質問の下にコメントを書きました。

方法は次のとおりです。3 つのサブプロジェクトを含む sbt ルート プロジェクトをセットアップします。

  • 一般
  • フロントエンド
  • バックエンド

両方のプロジェクトに共通するすべてのものを配置します。commonたとえば、それらが共有するメッセージ、フロントエンドで作成されてバックエンドにデプロイされるアクター クラスです。

reference.conf共通のプロジェクトに入れます。これが私のものです:

akka {
loglevel = INFO
actor {
    provider = "akka.cluster.ClusterActorRefProvider"
    debug {
        lifecycle = on
    }
}

 cluster {
      seed-nodes = [
        "akka.tcp://application@127.0.0.1:2558",
        "akka.tcp://application@127.0.0.1:2559"
      ]
  }

}

今フロントエンドで:

akka {


    remote {
        log-remote-lifecycle-events = off
        netty.tcp {
            hostname = "127.0.0.1"
            port = 2558
        }
    }

    cluster {
      auto-down = on
      roles = [frontend]
    }
}

そしてバックエンド

akka {

    remote {
        log-remote-lifecycle-events = off
        netty.tcp {
            hostname = "127.0.0.1"
            port = 0
        }
    }

    cluster {
      auto-down = on
      roles = [backend]
    }
}

これは次のように動作します: クラスターを制御するフロント部分を最初に開始します。次に、自動的に参加する任意の数のバックエンドを開始できます (ポートを見てください。ポートは 0 であるため、ランダムに選択されます)。

ここで、ロジック全体をフロントエンド main に追加する必要があります。 name でアクター システムを作成しますapplication

val system = ActorSystem("application")

バックエンドのメインでも同じことを行います。

次に、ルーターを使用してワーカーを作成するように、前にコードを記述します。これが私のコード例です。

context.actorOf(ServiceRuntimeActor.props(serviceName)
        .withRouter(
          ClusterRouterConfig(ConsistentHashingRouter(),
            ClusterRouterSettings(
              totalInstances = 10, maxInstancesPerNode = 3,
            allowLocalRoutees = false, useRole = Some("backend"))
          )
        ),
        name = shortServiceName)

ServiceRuntimeActorワーカーの名前に変更するだけです。開始したすべてのバックエンドにワーカーをデプロイし、これをノードごとに最大 3 つ、合計で最大 10 に制限します。

これが役立つことを願っています。

于 2014-03-28T13:03:21.750 に答える