2017-01-03 5 views
1

同じ名前を共有しているアクターを別のパスに置く可能性をブロックしようとしていますのでInvalidActorNameExceptionスローされることはありません)AKKA-クラスター内でその名前がuniqeではない場合のアクターの作成をブロックする方法

application.conf:

someactor { 
    akka.remote.netty.tcp.port = 6405 
    akka.cluster.auto-down-unreachable-after = 20s 
    akka.cluster.seed-nodes = ["akka.tcp://[email protected]:2552"] 
    akka.actor.provider = "akka.cluster.ClusterActorRefProvider" 
} 

メイン:

object SomeActor extends App { 
    val system = ActorSystem("mySys", ConfigFactory.load("application").getConfig("someactor")) 
    val t = system.actorOf(Props(classOf[SomeActor]), "someActor") 
} 

俳優:

class SomeActor extends Actor { 
    val cluster = Cluster(SomeActor.system) 
    override def receive = { 
     case x=> println(x) 
    } 
} 

6405ポートで1回、6406ポートで1回アプリケーションを実行すると、アプリケーションは動作しますが、システムに「someActor」という名前のアクタが既に含まれていることがわかります。

名前をロールとして追加したり、他の設定に追加しても構いませんが、既存の名前を含むマップのような状態を持つことはできません。メッセージの受け渡しを伴うマップ)、またはactorSelectionのような長時間実行する操作を持つことができます(いずれにしても、複数の場所から並列に呼び出された場合は安全ではありません)。

+2

競合状態になりやすいアプローチのようです。両方のアクターが同じ時点で異なるノードに作成される場合はどうなりますか?だから、最初に達成したいことを説明してください。 (ClusterSingletonのようなものの後ろにいるのですか?ClusterSingletonには、クラスタ内のすべてのノードで合意されていることが知られている最も古いノードにシングルトンを置かなければならない同様のチェックが含まれています。) – jrudolph

+1

あなたが本当に探しているのは、および/またはクラスタシングルトンを使用します。 – Ryan

+0

私が間違っていても、クラスタのシングルトンではなく、そのタイプのアクターの作成をブロックしていれば訂正してください。もし私がクラス「SomeActor」クラスの多くの俳優を作りたいと思っているので、それは私のためにはうまくいかないでしょう。私は同じ名前を持つ俳優を望んでいません(この名前は、俳優、私は重複を持つことはできません) –

答えて

0

私はクラスター型のクラスターアウェアルータで管理しました(各アクターはリモートノード上で実行されます)。 ノードの役割は "someActor"という名前で、リモートノードのactorを "someActor"という名前で初期化しています(このアクターへのパスを知っています)。ルータのtotalInstances configは1 (これだけのノードは、ルータの一部となる)

ルータINIT:

context.actorOf(
     ClusterRouterGroup(RoundRobinGroup(Nil), ClusterRouterGroupSettings(
      totalInstances = 1, routeesPaths = List("/user/someActor"), 
      allowLocalRoutees = false, useRole = Some("someActor"))).props() 

遠隔俳優:

object RemoteActor extends App{ 
    val system = ActorSystem("mySys",ConfigFactory.load("remoteActorConfig")) 
    system.actorOf(Props[RemoteActor], "someActor") 

} 

class RemoteActor extends Actor with ActorLogging{ 
    override def receive: Receive = { 
    case x => 
     log.info(s"got: $x}") 
    } 
} 

とremoteActorConfig:

akka{ 
    remote.netty.tcp.port = 0 
    cluster.auto-down-unreachable-after = 20s 
    cluster.seed-nodes = ["akka.tcp://[email protected]:2552"] 
    cluster.roles.1 = "someActor" 
    actor.provider = "akka.cluster.ClusterActorRefProvider" 
} 

ここでRemoteActorを2回実行すると、ルータを初期化するアプリケーションを実行してルータにブロードキャストメッセージを送信します.1人の俳優のRemoterActorだけがそれを受信します(常に同じものです)。

0

本当に重複しないUUIDが100%必要な場合は、アクターを作成する前にUUID割り当て用のサービスを1つ作成してUUIDを取得するだけですか?

また、ホスト名、ポート、およびアクタ名にSHAハッシュを使用し、アクタごとに増分する作業者番号を使用することもできます。

ワーカー用のクラスタルーターを設定することもできます.akkaはすべての作業を行い、ワーカープールにアクセスするために1つのActorRefに送信するだけです。

+0

ユニーク識別子はすでにシステムに存在していますので、自分自身を作成することはできません –

関連する問題