确定和处理Akka中闲置角色的最佳实践
我是Akka框架的新手,我正在用它构建一个群组聊天应用程序。我的应用程序可能有1000万个相同类型的actor实例(每个群组聊天都有一个actor实例),其中只有5%是高度活跃的,60%可以闲置几天(不接收任何消息) 我想知道:确定和处理Akka中闲置角色的最佳实践,akka,actor,Akka,Actor,我是Akka框架的新手,我正在用它构建一个群组聊天应用程序。我的应用程序可能有1000万个相同类型的actor实例(每个群组聊天都有一个actor实例),其中只有5%是高度活跃的,60%可以闲置几天(不接收任何消息) 我想知道: 是否有最佳实践来识别这些闲置的参与者 处理这些问题的最佳做法是什么?阻止他们够了吗 是否有最佳实践来识别这些闲置的参与者 唯一的方法是让每个参与者保持上次活动的时间。然后,为了加快对最长非活动参与者的调查,您可以组织一个类似索引的结构,例如PriorityQueue。然
ActorContext
有一个方法,该方法定义了参与者的非活动阈值:如果参与者在给定的时间内没有收到消息,则会向参与者发送akka.actor.ReceiveTimeout
消息。例如:
导入akka.actor.{actor,ReceiveTimeout}
导入scala.concurrent.duration_
类ChatActor扩展了Actor{
context.setReceiveTimeout(2小时)
def接收={
案例接收超时=>
//做点什么
//其他案例条款
}
}
如果上面的ChatActor
已经两个小时没有收到消息,它将收到一条ReceiveTimeout
消息。(但是,正如文档所述:“接收超时可能会在另一条消息进入队列后立即触发并进入队列,ReceiveTimeout
消息;因此,不保证在接收到接收超时时,必须事先有一个空闲时间,如通过此方法配置的那样。”)
处理这些问题的最佳做法是什么 阻止不活跃的演员是个好主意;否则,您可能会出现内存泄漏。以下是阻止这些参与者的几种方法:
- 非活动参与者抛出异常,该异常在参与者的父级中定义的中处理。在监控策略中,父级停止空闲参与者(例如,通过
)上下文停止发送者()
- 非活动参与者将其
自身
引用发送给“收割者”参与者,该参与者收集对空闲参与者的引用,并定期(可能使用一种方法)剔除(即停止)这些参与者
- 非活动参与者自行停止(通过
)上下文停止自我
阻止他们够了吗 当一个参与者停止时,其
ActorRef
实际上变得无效。从:
停止某个参与者后,将调用其postStop
钩子,该钩子可用于从其他服务注销该参与者。此钩子保证在禁用此参与者的消息队列后运行,即发送到已停止参与者的消息将重定向到ActorSystem
的deadLetters
此时,现在过时的ActorRef
指向的底层actor实例有资格进行垃圾收集。换句话说,必须停止某个参与者,使其符合垃圾收集的条件。因此,在释放内存方面,停止参与者就足够了。您还可以在参与者停止后删除无效的ActorRef
本身。请注意,不会自动停止参与者:
重要的是要注意,当不再引用时,参与者不会自动停止,创建的每个参与者也必须显式销毁
1-我应该将“类似索引的结构”存储在它们的父actor中?存储在任何可以定期唤醒和清理它的actor中。2-停止一个actor是否不足以释放它的内存?停止一个actor意味着它停止处理新消息,它对占用的内存没有影响。内存是根据JVM规则释放的:当一个参与者不再被引用而成为垃圾时。