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::open
和 middleman::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
即可)。
我刚刚了解了 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::open
和 middleman::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
即可)。