scala - Akka Actor 有多重?

标签 scala akka actor

我知道这是一个非常不精确的问题,可能被认为不适合 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/

相关文章:

java - Scala 中两个纪元日之间的天数

scala - 使用部分应用函数,性能问题

scala - Play 2.4 : Schedule a recurring task at app startup with dependency injection

java - 如何从java关闭akka

scala - 未找到 : object akka?

python - Hadoop Spark 1.4.1 - 对多个 CSV 文件进行排序并将排序后的结果保存在 1 个输出文件中

sql - 如何将map传入spark中的UDF

java - Couchbase - 通过 Java SDK 批量插入 - 如何使用 Akka 进行扩展?

scala - 使用 Scala Actor 和 receiveWithin 的 Stackoverflow 异常

scala - Akka的分布式 Actor