如何在caf中找到一个演员

时间:2016-04-10 10:04:28

标签: c++ c++-actor-framework

我开始玩咖啡馆并用它来代表图表 由于这个图是单向的,我可以创建我需要的actor并相应地链接它们,但是现在我想找到一个由它的名字标识的特定actor。

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})
}

如果是这样,开销不会很大,因为如果它们与消息匹配,则必须检查所有节点? 或者还有其他方法我在文档中找不到?

1 个答案:

答案 0 :(得分:2)

我认为这个小组是一个好主意,因为它也可以分发。通过向组发布每个衍生的actor而不是广播消息,您可以获得更好的可伸缩性。

然后,需要name <-> actor映射的每个actor都会订阅该组(在您实际生成节点之前)。每当您生成一个新节点时,都会将其名称及其句柄发送给该组,并且每个侦听器都会将此映射添加到其本地状态(如果只对几个选定名称感兴趣,则忽略该消息)。

如果您有很多需要名称映射的actor并且您不想多次复制映射,您也可以使用单个actor而不是存储地图的组,并且可以查询当他们需要解决名称时,由其他人。

您的第三个选项是使用actor注册表,但这只能在本地使用,并且只有在您可以使用atom名称时才能使用。如果这与您的用例匹配,那么您可以通过detail::singletons::get_actor_registry()->put_named(key, value);注册新的参与者,并通过detail::singletons::get_actor_registry()->get_named(key);检索它们。我通常不会推荐detail命名空间中的功能,但这个特殊功能将以0.15的形式进入公共API。顺便说一下,您可以动态创建atom_value,但当然限制为10个字符,并且只允许使用字母数字字符。

希望有所帮助。