我知道这是一个非常不精确的问题,可能被认为不适合 stackoverflow。不幸的是,较小的应用程序(就参与者的数量而言)和“类似教程”的应用程序并不能帮助我培养关于消息分发开销的直觉以及“scala 对象”和“CORBA 对象”之间粒度的快速点.
虽然几乎可以肯定保持与客户端的对话状态值得一个参与者,但在大多数实际用例中,它会涉及由许多类建模的条件/并行/替代交互。这使得可以选择将参与者视为非常复杂的服务的外观,类似于刚刚退休的 EJB,或者类似于 smalltalk 对象,只要通信可能以异步方式实现,就会在彼此之间随意触发消息。
除了消息传递本身的开销外,生命周期管理也会涉及开销,我担心由于异常或根中的其他错误而导致整个 actor 子树的链式重启引起的潜在问题。
为了这个问题,我们可以假设绝大多数通信发生在一台机器内,网络交叉是微不足道的。
最佳答案
我不确定您所说的“消息传递本身的开销”是什么意思。
当不涉及网络/序列化时,开销可以忽略不计:一侧将消息推送到队列中,另一侧从中读取消息。
Akka 声称它可以在一台机器上每秒处理 5000 万条消息。这意味着您不会将actor 用作复杂子系统的外观。您宁愿将它们建模为更小的“工作单元”。在方便时,它们可能比 smalltalk 对象更复杂。你可以说,KafkaConsumerActor
这将在内部使用其他“普通”类,例如连接、配置等,这些不必是 akka Actor 。但它仍然足够小,可以作为一个简单的工作单元做一件简单的事情(消费一条消息并将其发送到某个地方)。
每秒5000万真的很多。
内存占用也非常小。 Akka 声称只需 1GB 的堆就可以拥有约 250 万个 actor。与典型系统所做的相比,它确实什么都没有。
至于生命周期,创建一个 actor 并不比创建一个类实例和一个邮箱重多少,所以我真的不希望它有那么重要。
话虽如此,通常您的系统中没有多少参与者可以处理一条消息并死亡。通常你会产生生命周期更长的 Actor 。就像,根据您提供的参数计算您的抵押贷款还款额的 Actor 根本没有任何理由死亡。
Akka 还使得使用 actor 池(它们的不同种类)变得非常简单。
所以这里的性能是非常可调整的。
最后一点是您应该在上下文中比较 Akka 开销。例如,如果您的系统正在执行数据库查询,或服务/执行 HTTP 请求,甚至执行某种重要的 IO,那么这些事件的开销可能会使 Akka 的开销变得微不足道,因此您甚至不会费心去考虑它。就像 50 毫秒到 DB 的往返将相当于大约 250 万条 akka 消息的开销。有关系吗?
那么你能找到一个 Akka 会强制你支付绩效惩罚的边缘情况吗?大概。 Akka 不是金锤(而且什么都不是)。
但是考虑到上述所有内容,您应该考虑是 Akka 在您的特定上下文中成为性能瓶颈,还是您在微优化上浪费时间。
关于scala - Akka Actor 有多重?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35234343/