如何"发布"CAF中的大量演员?

Seb*_*iot 5 c++ distributed-computing actor c++-actor-framework

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

让我感到惊讶的一件事是,通过网络提供演员的方法是将其"发布"特定的TCP端口.

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

为了使发布可扩展,每个进程应该只需要为一个系统中的每个actor 打开1个端口,并打开1个连接到他们想要访问的每个actor系统.

有没有办法发布一个actor作为actor系统中所有actor 的代理(最好没有任何重大的性能损失)?

nev*_*ord 2

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

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

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

如果您不关心publish/提供的演员集合点remote_actor,那么您也可以使用middleman::openandmiddleman::connect代替。这只会连接两个 CAF 实例,而不交换 actor 句柄。相反,成功时connect将返回 a 。node_id这就是某些功能所需的全部内容。例如演员的远程生成

有没有一种方法可以将一个参与者发布为参与者系统中所有参与者的代理(最好没有任何显着的性能损失)?

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

推荐的方法是编写一个自定义参与者,通过提供某种字典来显式模拟多个系统之间的交汇。

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