我刚刚了解了CAF,C++ Actor Framework。
让我感到惊讶的一件事是,通过网络提供演员的方法是"publish"到特定的TCP端口。
这基本上意味着您可以发布的actor的数量受到您拥有的端口数量(64k)的限制。由于你需要一个端口来发布一个actor和一个端口来访问一个远程actor,我假设两个进程每个最多可以共享大约32k个actor,而它们每个可能在商品服务器上拥有一百万个actor。 。如果集群有10个节点,那就更糟了。
为了使发布可扩展,每个进程只需要为一个系统中的每个actor打开 1 端口,并打开与每个actor系统的 1 连接他们想要访问。
有没有办法将一个actor作为代理发布给一个actor系统中的所有actor(最好没有任何重大的性能损失)?
答案 0 :(得分:1)
在基于代理的系统中使用的一种方法(不确定CAF是否实现了这种方式的工具)是使用多个传输类{ inproc:// | ipc:// | tcp:// | .. | vmci:// }
,因此可以根据需要选择
虽然构建一个代理可能听起来很有吸引力,但是将两个不同的演员模型焊接在另一个“顶上”并不意味着它听起来很简单(eventloops很脆弱)以公平的方式调整/阻止阻止/事件处理 - 不喜欢任何其他主人试图拿走他们自己的帽子......)。
仍然可以采用O / S级步骤和措施,并在必要时利用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
这样,配置空间可以扩展,以便CAF不为这些角色提供任何其他手段,但所述TCP(地址:端口号) - 传输类。
答案 1 :(得分:1)
让我补充一些背景知识。 middleman::publish
/ middleman::remote_actor
函数对执行两项操作:连接两个CAF实例并为您提供与远程actor通信的句柄。您“发布”到给定端口的actor应该充当入口点。这是一个方便的会合点,仅此而已。
你需要在两个演员之间进行沟通才能掌握。当然,如果你想与更多的演员交谈,你需要以某种方式学习新的句柄。 remote_actor
函数只是在两个actor之间实现集合的简便方法。但是,在学习了句柄后,您可以在分布式系统中自由传递它。 Actor控件是网络透明的。
此外,CAF将始终在两个actor系统之间维护单 TCP连接。如果您在主机A上发布10个actor并通过remote_actor
从主机B“连接”到所有10个actor,您将看到CAF最初将打开10个连接(因为目标节点可以运行多个actor系统)但是所有但是一个连接将被关闭。
如果您不关心publish
/ remote_actor
提供的演员的集合点,那么您也可以使用middleman::open
和middleman::connect
。这将只连接两个CAF实例而不交换actor控件。相反,connect
会在成功时返回node_id
。这就是一些功能所需要的。例如remote spawning of actors。
有没有办法发布一个actor作为actor系统中所有actor的代理(最好没有任何重大的性能损失)?
您可以在一个端口发布一个actor,其唯一目的是为集合点建模。如果该actor向远程actor发送1000个以上的actor句柄,则不会导致任何额外的网络连接。
建议通过提供某种排序字典来编写一个显式建模多个系统之间集合点的自定义actor。
仅仅为了完整起见:CAF还有一个注册机制。但是,密钥限制为atom
值,即10个字符或更少。由于注册表是通用的,它也只存储strong_actor_ptr
并为您保留类型安全性。但是,如果这就是您所需要的:您将句柄放入注册表(请参阅actor_system::registry
),然后通过middleman::remote_lookup
远程访问此注册表(您只需要node_id
来执行此操作)。< / p>