gpt4 book ai didi

akka - 识别和处理 Akka 中闲置参与者的最佳实践

转载 作者:行者123 更新时间:2023-12-02 17:08:38 25 4
gpt4 key购买 nike

我是 Akka 框架的新手,我正在用它构建一个群聊应用程序。我的应用程序可能有 1000 万个相同类型的 actor 实例(每个群聊一个 actor 实例),其中只有 5% 是高度活跃的,而其中的 60% 可以闲置(没有收到任何消息)几天。

我想知道:

  1. 是否有识别这些闲置参与者的最佳做法?
  2. 处理它们的最佳做法是什么?阻止他们就够了吗?

最佳答案

Is there any best practice to identify these idle actors?

Actor 的 ActorContext 有一个 setReceiveTimeout为 actor 定义不活动阈值的方法:如果 actor 在给定的时间内未收到消息,则 akka.actor.ReceiveTimeout 消息将发送给 actor。例如:

import akka.actor.{ Actor, ReceiveTimeout }
import scala.concurrent.duration._

class ChatActor extends Actor {
context.setReceiveTimeout(2 hours)

def receive = {
case ReceiveTimeout =>
// do something

// other case clauses
}
}

上面的 ChatActor 如果两个小时没有收到消息,将收到一条 ReceiveTimeout 消息。 (但是,正如文档所述:“接收超时可能会触发并在另一条消息入队后立即将 ReceiveTimeout 消息入队;因此不能保证在接收到接收超时必须事先通过此方法配置的空闲期。”)


What is the best practice to deal with them?

停止不活跃的 Actor 是个好主意;否则你可能会发生内存泄漏。以下是阻止这些参与者的几种方法:

  • 不活动的 actor 抛出异常,该异常在 supervisor strategy 中处理在 Actor 的 parent 中定义。在主管策略中,父级停止空闲角色(例如,通过 context stop sender())。
  • 不活动的 actor 将其 self 引用发送给“收割者”actor,该 actor 收集对空闲 actor 的引用并定期剔除(即停止)这些 actor(可能使用 scheduler ) .
  • 不活动的 actor 自行停止(通过 context stop self)。

可以找到有关停止 actors 的更多信息 here .


Is stopping them enough?

当一个 actor 停止时,它的 ActorRef 本质上变得无效。来自documentation :

After stopping an actor, its postStop hook is called, which may be used e.g. for deregistering this actor from other services. This hook is guaranteed to run after message queuing has been disabled for this actor, i.e. messages sent to a stopped actor will be redirected to the deadLetters of the ActorSystem.

此时,现在过时的 ActorRef 指向的底层 actor 实例符合垃圾回收条件。换句话说,必须停止 actor 才能使其有资格进行垃圾收集。因此,关于释放内存,停止 actor 就足够了。您还可以在 actor 停止后删除无效的 ActorRef 本身。注意 removing an ActorRef不会自动停止 Actor :

It is important to note that Actors do not stop automatically when no longer referenced, every Actor that is created must also explicitly be destroyed.

关于akka - 识别和处理 Akka 中闲置参与者的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50442813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com