从Akka的文档中看到的关于ReceiveTimeout的内容。我还是不明白它的意思,为什么要设置它?有没有人能教我一个实际的用例?
ijnw1ujt1#
每个参与者都消耗一定数量的内存(在大多数JVM上,Akka本身的开销是每个参与者消耗数百字节;此外,每个参与者可以保存任意大量的内存中状态)。因此,在不再需要某个参与者时将其停止是有好处的:如果没有别的,更大的内存消耗往往意味着更长的垃圾收集周期,这可能会导致丢失集群心跳或延迟峰值等问题。在某些情况下,不再需要某个参与者的时间点可以在其与其他参与者的交互中很容易地确定。例如,生成一个参与者以协调特定任务:一旦完成任务,就可以停止执行元。然而,在其他情况下,参与者的工作并没有明显的完成点。在某些情况下,人们可能会从一段时间没有消息发送到参与者这一事实中推断出不再需要该参与者。这种情况在封装域对象状态的参与者中可能最为常见。例如,代表购物车的参与者:如果购物车在2个小时内没有结帐或者没有添加/删除任何项目,那么就可以说客户离开了站点,购物车没有任何用处。这种情况的一个特别常见的示例是,参与者的状态已经持久保存在其他地方,内存中的参与者是一个缓存:如果我们猜错了,我们可以停止执行元并重新加载其状态(当我们必须从数据存储读取而不是命中快得多的存储器时,不正确地停止执行元的代价变成额外的等待时间)。因此,您永远不需要设置接收超时,但在许多情况下这样做是有用的。
1条答案
按热度按时间ijnw1ujt1#
每个参与者都消耗一定数量的内存(在大多数JVM上,Akka本身的开销是每个参与者消耗数百字节;此外,每个参与者可以保存任意大量的内存中状态)。因此,在不再需要某个参与者时将其停止是有好处的:如果没有别的,更大的内存消耗往往意味着更长的垃圾收集周期,这可能会导致丢失集群心跳或延迟峰值等问题。
在某些情况下,不再需要某个参与者的时间点可以在其与其他参与者的交互中很容易地确定。例如,生成一个参与者以协调特定任务:一旦完成任务,就可以停止执行元。
然而,在其他情况下,参与者的工作并没有明显的完成点。在某些情况下,人们可能会从一段时间没有消息发送到参与者这一事实中推断出不再需要该参与者。这种情况在封装域对象状态的参与者中可能最为常见。例如,代表购物车的参与者:如果购物车在2个小时内没有结帐或者没有添加/删除任何项目,那么就可以说客户离开了站点,购物车没有任何用处。这种情况的一个特别常见的示例是,参与者的状态已经持久保存在其他地方,内存中的参与者是一个缓存:如果我们猜错了,我们可以停止执行元并重新加载其状态(当我们必须从数据存储读取而不是命中快得多的存储器时,不正确地停止执行元的代价变成额外的等待时间)。
因此,您永远不需要设置接收超时,但在许多情况下这样做是有用的。