2016-07-26 5 views
0

Akkaに基づいて分散メールメールボックスシステムを作成したいと思います。私のアプリが起動すると、すべての受信トレイのアクタを作成し、10秒間隔でメールを受信するスケジューラを起動したいと考えています。 これらの受信ボックスアクターを作成する方法に問題がありますか?クラスター上にアクターを作成することも、存在する場合はそれを参照することもできますか?アクター名は、データベース内のメールボックスUUIDにすることができ、特定のUUIDを持つアクターのみがクラスタ内に存在することができます。分散メールメールボックスのAkkaアクターシステムデザイン

最も重要な質問は、クラスタ内で名前としてuuidを使用してアクタを作成する方法、または存在する場合はその参照を取得する方法です。私は、この設定を試してみてください。

actor { 
    provider = "akka.cluster.ClusterActorRefProvider" 
    } 
    remote { 
    enabled-transports = ["akka.remote.netty.tcp"] 
    log-remote-lifecycle-events = on 
    netty.tcp { 
     hostname = "127.0.0.1" 
     port = 2552 
    } 
    } 

    cluster { 
    seed-nodes = [ 
     "akka.tcp://[email protected]:2552"] 
} 

そして、このコードの俳優を作成したり、

def createActorIfNotExists(actorSystem: ActorSystem, name: String, props: Props) 
          (implicit ec: ExecutionContext): Unit = { 
    implicit val timeout = Timeout(5 seconds) 

    actorSystem.actorSelection(name).resolveOne() onComplete { 
     case Success(actor) => 
     Logger.debug(s"Actor already created $name") 
     case Failure(ex) => 
     Logger.debug(s"Creating actor $name") 
     val actor = actorSystem.actorOf(props, name) 
    } 
    } 

しかし、コードの上に、それへの参照を取得するためには、クラスタ上で代わりにローカルのアクター・システム上で役者を作成する(次のノードが自身の俳優を作成する代わりに、選択します既存)。

送信トレイについては、ディスパッチャーの俳優についても考えています。 Dispatcherはクラスタ・シングルトンになり、メッセージを右アクタの子に送信します。しかし、それはボトルネックになる可能性がありますか?シングルトンのための

俳優のパスが

答えて

1

はあなたが何をしたいかのような音の例/ユーザー/メールボックスのために、特定の送信トレイ/ユーザー/メールボックス/ UUIDのためにすることができ、かなりうまくアッカクラスタシャーディングと一致します。

これを使用すると、IDを使用してアクターに対処し、クラスター全体でアクターのバランスを取ることができます。

現在のドキュメントでそれについての詳細を読むことができます:http://doc.akka.io/docs/akka/2.4/scala/cluster-sharding.html#cluster-sharding-scala

+0

ありがとう、これは私が必要なものです。システムの起動時にすべてのエンティティを起動し、タスクをperdiodicalyダウンロードメールにスケジュールすることは可能ですか教えてください。 – user2860204

+0

起動時にすべてのIDを取得する必要があります。定期的なダウンロードのスケジュールは、アクターシステムスケジューラを使用して行うことができます。あなたは、オスの箱の予想される量と比較してあなたの解決策がどのようにスケールするかについて慎重に考える必要があります。 – johanandren