akka演员有多重?
How heavy are akka actors?
我知道这是一个非常不精确的问题,可能被认为不适合 Whosebug。不幸的是,较小的应用程序(就参与者的数量而言)和 'tutorial-like' 的应用程序无法帮助我形成关于消息分发开销的直觉和 swift 粒度介于 'scala object' 和'CORBA object'.
虽然几乎可以肯定,例如与客户保持对话状态值得演员,但在大多数实际用例中,它会涉及 conditional/parallel/alternative 由许多 类 建模的交互。这使得在将 Actor 视为非常复杂的服务的门面之间做出选择,类似于刚刚退役的 EJB,或者类似于 smalltalk 对象,只要可以以异步方式实现通信,就会在彼此之间随意触发消息。
除了消息传递本身的开销外,生命周期管理也会涉及开销,我对由于根中的异常或其他错误导致整个参与者子树的链式重启造成的潜在问题持谨慎态度.
为了这个问题,我们可以假设绝大多数通信发生在一台机器内,网络交叉是微不足道的。
我不确定 "overhead of message passing itself" 是什么意思。
当不涉及 network/serialisation 时,开销可以忽略不计:一侧将消息推送到队列中,另一侧从中读取。
Akka 声称它可以在一台机器上每秒处理 5000 万条消息。这意味着您不会仅将参与者用作复杂子系统的外观。您宁愿将它们建模为更小的 "working units"。在方便的时候,它们可以比 smalltalk 对象更复杂。你可以有,比方说,KafkaConsumerActor
,它会在内部使用其他 "normal" classes,例如 Connection、Configuration 等,这些不一定是 akka actor。但它仍然足够小,可以作为一个简单的工作单元来做一件简单的事情(消费一条消息并将其发送到某个地方)。
5000万一秒真的很多
内存占用也极小。 Akka 本身声称仅 1GB 的堆就可以拥有约 250 万个演员。与典型系统的功能相比,它确实算不了什么。
至于生命周期,创建一个 actor 并不比创建一个 class 实例和一个邮箱重很多,所以我真的不认为它有那么重要。
话虽如此,通常您的系统中不会有很多参与者会处理一条消息并死亡。通常你会产生寿命更长的演员。就像,根据您提供的参数计算您的抵押贷款还款的演员根本没有任何理由死亡。
此外,Akka 使使用演员池(不同种类的演员池)变得非常简单。
所以这里的性能是非常可调的。
最后一点是您应该在上下文中比较 Akka 开销。例如,如果您的系统正在执行数据库查询,或 serving/performing HTTP 请求,或者甚至在执行某种重要的 IO,那么这些活动的开销可能会使 Akka 的开销变得微不足道,因此您甚至不会费心去思考它。就像 50 毫秒到数据库的往返行程相当于约 250 万条 akka 消息的开销。有关系吗?
那么你能找到 Akka 会强制你支付性能惩罚的边缘情况吗?大概。 Akka 不是金锤子(什么都不是)。
但是考虑到以上所有内容,您应该考虑是否是 Akka 在您的特定上下文中成为性能瓶颈,或者您是在浪费时间进行微优化。
我知道这是一个非常不精确的问题,可能被认为不适合 Whosebug。不幸的是,较小的应用程序(就参与者的数量而言)和 'tutorial-like' 的应用程序无法帮助我形成关于消息分发开销的直觉和 swift 粒度介于 'scala object' 和'CORBA object'.
虽然几乎可以肯定,例如与客户保持对话状态值得演员,但在大多数实际用例中,它会涉及 conditional/parallel/alternative 由许多 类 建模的交互。这使得在将 Actor 视为非常复杂的服务的门面之间做出选择,类似于刚刚退役的 EJB,或者类似于 smalltalk 对象,只要可以以异步方式实现通信,就会在彼此之间随意触发消息。
除了消息传递本身的开销外,生命周期管理也会涉及开销,我对由于根中的异常或其他错误导致整个参与者子树的链式重启造成的潜在问题持谨慎态度.
为了这个问题,我们可以假设绝大多数通信发生在一台机器内,网络交叉是微不足道的。
我不确定 "overhead of message passing itself" 是什么意思。 当不涉及 network/serialisation 时,开销可以忽略不计:一侧将消息推送到队列中,另一侧从中读取。
Akka 声称它可以在一台机器上每秒处理 5000 万条消息。这意味着您不会仅将参与者用作复杂子系统的外观。您宁愿将它们建模为更小的 "working units"。在方便的时候,它们可以比 smalltalk 对象更复杂。你可以有,比方说,KafkaConsumerActor
,它会在内部使用其他 "normal" classes,例如 Connection、Configuration 等,这些不一定是 akka actor。但它仍然足够小,可以作为一个简单的工作单元来做一件简单的事情(消费一条消息并将其发送到某个地方)。
5000万一秒真的很多
内存占用也极小。 Akka 本身声称仅 1GB 的堆就可以拥有约 250 万个演员。与典型系统的功能相比,它确实算不了什么。
至于生命周期,创建一个 actor 并不比创建一个 class 实例和一个邮箱重很多,所以我真的不认为它有那么重要。
话虽如此,通常您的系统中不会有很多参与者会处理一条消息并死亡。通常你会产生寿命更长的演员。就像,根据您提供的参数计算您的抵押贷款还款的演员根本没有任何理由死亡。
此外,Akka 使使用演员池(不同种类的演员池)变得非常简单。
所以这里的性能是非常可调的。
最后一点是您应该在上下文中比较 Akka 开销。例如,如果您的系统正在执行数据库查询,或 serving/performing HTTP 请求,或者甚至在执行某种重要的 IO,那么这些活动的开销可能会使 Akka 的开销变得微不足道,因此您甚至不会费心去思考它。就像 50 毫秒到数据库的往返行程相当于约 250 万条 akka 消息的开销。有关系吗?
那么你能找到 Akka 会强制你支付性能惩罚的边缘情况吗?大概。 Akka 不是金锤子(什么都不是)。
但是考虑到以上所有内容,您应该考虑是否是 Akka 在您的特定上下文中成为性能瓶颈,或者您是在浪费时间进行微优化。