【发布时间】:2021-08-24 11:14:02
【问题描述】:
来自 Akka 关于ReceiveTimeout 的文档。我仍然无法理解它,为什么需要设置它?谁能教我现实中的用例?
【问题讨论】:
来自 Akka 关于ReceiveTimeout 的文档。我仍然无法理解它,为什么需要设置它?谁能教我现实中的用例?
【问题讨论】:
每个actor都会消耗一些内存(Akka 本身在大多数 JVM 上每个actor都有数百字节的开销;此外,每个actor可以保持任意大量的内存状态)。因此,在不再需要 Actor 时将其停止是有好处的:如果没有别的,更大的内存消耗往往意味着更长的垃圾收集周期,这可能会导致诸如错过集群心跳或延迟峰值之类的事情。
在某些情况下,可以在与其他参与者的交互中轻松确定不再需要参与者的点。这方面的一个例子是产生一个演员来协调一个特定的任务:一旦任务完成,演员可以停止。
但是,在其他情况下,演员的工作没有明显的完成点。在某些情况下,人们可能会从一段时间内没有向参与者发送消息这一事实推断出不再需要参与者。这种事情在封装领域对象状态的actor中可能最常见。这方面的一个例子可能是一个代表购物车的演员:如果购物车没有被签出或者在 2 小时内添加/删除了一个项目,那么可以说客户离开了网站并且购物车没有t 服务于任何有用的目的。这种事情的一个特别常见的例子是actor的状态已经持久地保存在其他地方并且内存中的actor是一个缓存:如果我们猜错了,我们可以停止actor并重新加载它的状态(不正确停止的代价)当我们必须从数据存储中读取而不是使用更快的内存时,actor 会产生额外的延迟)。
因此,您永远需要设置接收超时,但在许多情况下这样做很有用。
【讨论】: