Как найти актера в кафе

Я начал играть с кафе и использовать его для представления графика.
Поскольку этот график не является однонаправленным, я могу создавать нужные мне актеры и связывать их соответственно, но теперь я хочу найти конкретного актера, идентифицируемого по его имени.

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 Затем отображение будет подписываться на группу (до того, как вы на самом деле породите свои узлы). Всякий раз, когда вы создаете новый узел, вы отправляете его имя вместе с его дескриптором группе, и каждый слушатель добавляет это отображение в свое локальное состояние (или игнорирует сообщение, если его интересуют только несколько выбранных имен).

Если у вас много актеров, которым требуется сопоставление имен, и вы не хотите многократно повторять сопоставление, вы также можете использовать один актер вместо группы, которая хранит карту и может запрашиваться другими, когда им нужно. разрешить имя.

Ваш третий вариант — использовать реестр актеров, но это будет работать только локально и только если вы можете использовать atom имена. Если это соответствует вашему варианту использования, вы можете зарегистрировать новых актеров через detail::singletons::get_actor_registry()->put_named(key, value); и получить их через detail::singletons::get_actor_registry()->get_named(key);, Я обычно не рекомендую функции из detail пространство имен, но эта особенность появится в общедоступном API в версии 0.15. Кстати, вы можете создать atom_value динамически, но вы, конечно, ограничены 10 символами и можете использовать только буквенно-цифровые символы.

Надеюсь, это поможет.

2

Другие решения

Других решений пока нет …