CAF如何"publish"海量演员?

How to "publish" a large number of actors in CAF?

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

让我吃惊的一件事是,让 actor 在网络上可用的方法是 "publish" 它到 特定的 TCP 端口 .

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

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

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

平滑缩放(几乎)没有限制是 alpha 和 omega

在基于代理的系统中使用的一种方法(不确定 CAF 是否已经实现了这种方式的工具)是使用多个传输-classes { inproc:// | ipc:// | tcp:// | .. | vmci:// } 从而能够选择来自,根据需要。

虽然构建一个 proxy 听起来很吸引人,但将两个不同的 actor-models 焊接在一起 "atop" 另一个并不意味着实现起来就像它一样简单听起来(事件循环很脆弱,无法以公平的方式进行调整/阻止阻塞/事件处理 - 不喜欢任何其他大师试图拿走自己的帽子......)。

如果 CAF 目前提供 除 TCP 外没有其他传输方式:

仍然可以使用 O/S-level 步骤和措施,并利用 ISO-OSI 模型的特性达到极限或在必要时使用:

sudo ip address add 172.16.100.17/24 dev eth0

或更好,使额外的 IP 地址永久化 - 即编辑文件 /etc/network/interfaces (或 Ubuntu )并添加尽可能多的节,使其看起来像:

iface eth0 inet static
    address 172.16.100.17/24

iface eth0 inet static
    address 172.16.24.11/24

通过这种方式,配置-space 可以扩展到 CAF 没有为此类参与者提供任何其他方式但所述 TCP(地址:端口#)-传输-class 的情况。

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

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

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

如果您不关心 publish/remote_actor 提供的 actors 集合点,那么您也可以使用 middleman::openmiddleman::connect 代替。这将只连接两个 CAF 实例而不交换角色句柄。相反,connect 将 return 一个 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 发送 1000 个以上的 actor 句柄,这将不会导致任何额外的网络连接。

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

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