2016-04-10 4 views
2

私はカフェで遊び始め、グラフを表現するために使い始めました。
このグラフは単方向であるため、必要なアクターを作成してそれに応じてリンクすることができますが、今はそのアクターの名前で特定された特定のアクターを探したいと思います。カフェで俳優を見つける方法

class node_actor : public event_based_actor{ 
    std::string m_name; 
    ... 
}; 

int main(){ 
    auto entry_actor = spawn<node_actor>(); 
    // node_actor will spawn other actors with names 
    // like this: node_actor will spawn node1 
    // node1 will spwan node2 
    // node2 will spwan node3 and so on 

    // now I want to send a message to node2 
    scoped_actor self; 
    self->send(n2, 42}); 
    ... 
} 

n2を見つける最良の方法はありますか?
これはグループによって処理され、メッセージをブロードキャストできますか?たとえば、次のようになります。

{ 
    auto g = group::get("local", "Node events"); 
    auto entry_actor = spawn_in_group<node_actor>(g); 
    // change all nodes to call spawn_in_group 

    scoped_actor self; 
    self->send(g, name, 42}) 
} 

メッセージが一致するとすべてのノードをチェックする必要があるため、それほどオーバーヘッドはありませんか?
また、私がまだドキュメントで見つけられなかった他の方法がありますか?

答えて

2

グループは良いアイデアだと思うのですが、それは配布されているためです。メッセージをブロードキャストするのではなく、各スポーンされたアクターをグループにアナウンスすることで、スケーラビリティを向上させることができます。

name <-> actorマッピングを必要とする各アクタは、(実際にノードをスポーンする前に)グループにサブスクライブします。新しいノードを生成するたびに、ハンドル名とともにそのグループに送信し、各リスナーはこのマッピングをローカル状態に追加します(または、選択されたいくつかの名前にのみ関心がある場合はメッセージを無視します)。

名前マッピングが必要なアクターがたくさんあり、マッピングを何度も複製したくない場合は、マップを格納しているグループの代わりに単一のアクターを使用することもできます。彼らが名前を解決する必要があるときはいつでも

3番目のオプションはアクターレジストリを使用することですが、これはローカルでのみ使用でき、​​の名前を使用できる場合にのみ有効です。これがユースケースに合っている場合は、detail::singletons::get_actor_registry()->put_named(key, value);で新しい俳優を登録し、detail::singletons::get_actor_registry()->get_named(key);で検索できます。私は通常、detail名前空間の機能を推奨しませんが、この特定の機能は公開APIに0.15で移行します。ちなみに、atom_valueは動的に作成できますが、もちろん10文字に制限されており、英数字のみを使用できます。

希望に役立ちます。

+0

ありがとう、私はそれを試してみましょう。私はドキュメントでそれを見つけられなかったので、もう一つのこと。第2のグループパラメータを使用してグループを分割することはできますか?例えば、group :: get( "local"、 "EvenNodes") 'と' group :: get( "local"、 "OddNodes") 'は2つのノードスペースを作る? – mkaes

+0

はい、2番目のパラメータは任意のユーザ定義の識別子(文字列)です。必要な数のグループを作成できます。 – neverlord

+0

'name'メンバを持つ' ConfigServ'と状態ベースのアクタについてはどうですか? – mavam