c++ - 如何 "publish"CAF中的大量 Actor ?

标签 c++ distributed-computing actor c++-actor-framework

我刚刚了解了 CAF,C++ Actor Framework .

让我感到惊讶的一件事是,通过网络使 Actor 可用的方法是"publish"。它到一个特定的 TCP 端口

这基本上意味着您可以发布的参与者数量受限于您拥有的端口数量 (64k)。由于您既需要一个端口来发布 Actor ,又需要一个端口来访问远程 Actor ,我假设两个进程每个最多能够共享大约 32k 个 Actor ,而它们可能每个都在商品服务器上拥有一百万个 Actor .如果集群有 10 个节点,情况会更糟。

为了使发布具有可扩展性,每个进程只需要为一个系统中的每个参与者打开1 端口,并打开与每个参与者系统的1 连接他们想要访问。

有没有办法将一个 Actor 发布为 Actor 系统中所有 Actor 的代理(最好没有任何显着的性能损失)?

最佳答案

让我补充一些背景。 middleman::publish/middleman::remote_actor 函数对做两件事:连接两个 CAF 实例并为您提供与远程参与者通信的句柄。您“发布”到给定端口的 actor 旨在充当入口点。这是一个方便的集合点,仅此而已。

两个 actor 之间的通信只需要一个句柄。当然,如果你想和更多的 Actor 交谈,你需要以某种方式学习新的把戏。 remote_actor 函数只是一种在两个参与者之间实现会合的便捷方式。但是,在您了解句柄后,您可以在分布式系统中自由传递它。 Actor 句柄是网络透明的。

此外,CAF 将始终在两个参与者系统之间保持单个 TCP 连接。如果您在主机 A 上发布 10 个参与者并通过 remote_actor“连接”到主机 B 的所有 10 个参与者,您将看到 CAF 最初将打开 10 个连接(因为目标节点可以运行多个参与者系统) 但除一个连接外的所有连接都将关闭。

如果您不关心 publish/remote_actor 提供的 actor 的集合点,那么您也可以使用 middleman::openmiddleman::connect 代替。这将只连接两个 CAF 实例而不交换角色句柄。相反,connect 将在成功时返回一个 node_id。这就是某些功能所需的全部。例如remote spawning of actors .

Is there a way to publish one actor as a proxy for all actors in an actor system ( preferably without any significant performance loss )?

您可以在端口发布一个 actor,其唯一目的是为会合点建模。如果该 actor 向远程 actor 发送 1000 个以上的 actor 句柄,这将不会导致任何额外的网络连接。

推荐的方法是编写一个自定义 actor,通过提供某种排序字典来显式建模多个系统之间的会合点。

只是为了完整起见:CAF 也有一个注册机制。但是,键限于 atom 值,即 10 个字符或更少。由于注册表是通用的,它也只存储 strong_actor_ptr 并将类型安全留给您。但是,如果这就是您所需要的:您将句柄放入注册表(请参阅 actor_system::registry),然后通过 middleman::remote_lookup 远程访问此注册表(您只需要node_id 来执行此操作)。

关于c++ - 如何 "publish"CAF中的大量 Actor ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46329780/

相关文章:

C++:如何使用cin和file两种方式获取输入?

python-2.7 - Dask 分布式。如何在正在计算的函数中获取任务 key ID?

distributed-computing - 什么是分布式平台、上下文、嵌入式系统?

matrix - 了解 block 和 block 循环矩阵分布

c++ - move_iterator 对于返回纯右值的迭代器被破坏并返回悬空引用

c++ - 如何清空 std::string?

c++ - 为什么 Linux 报告我的应用程序的内存使用量太大?

java - 不要在父供应商参与者重新启动时重新启动处理参与者

distributed-computing - AMQP 和 ZeroMQ 的区别

scala - 使用 Akka 进行 fork 和 join