我开始玩咖啡馆并用它来代表图表 由于这个图是单向的,我可以创建我需要的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})
}
如果是这样,开销不会很大,因为如果它们与消息匹配,则必须检查所有节点? 或者还有其他方法我在文档中找不到?
答案 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个字符,并且只允许使用字母数字字符。
希望有所帮助。