确定和处理Akka中闲置角色的最佳实践

确定和处理Akka中闲置角色的最佳实践,akka,actor,Akka,Actor,我是Akka框架的新手,我正在用它构建一个群组聊天应用程序。我的应用程序可能有1000万个相同类型的actor实例(每个群组聊天都有一个actor实例),其中只有5%是高度活跃的,60%可以闲置几天(不接收任何消息) 我想知道: 是否有最佳实践来识别这些闲置的参与者 处理这些问题的最佳做法是什么?阻止他们够了吗 是否有最佳实践来识别这些闲置的参与者 唯一的方法是让每个参与者保持上次活动的时间。然后,为了加快对最长非活动参与者的调查,您可以组织一个类似索引的结构,例如PriorityQueue。然

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

我想知道:

  • 是否有最佳实践来识别这些闲置的参与者
  • 处理这些问题的最佳做法是什么?阻止他们够了吗
  • 是否有最佳实践来识别这些闲置的参与者
  • 唯一的方法是让每个参与者保持上次活动的时间。然后,为了加快对最长非活动参与者的调查,您可以组织一个类似索引的结构,例如PriorityQueue。然后,一个专门的参与者周期性地唤醒并清除空闲时间超过某个预定义时间段的参与者的结构

  • 处理这些问题的最佳做法是什么?阻止他们够了吗
  • 空闲参与者不会消耗除核心内存以外的任何资源。如果你有足够的记忆力,最好的做法是什么都不做。若要保存该内存,请将actor存储在数据库中(经过一段时间的不活动),然后根据需要从数据库中读取它

    是否有最佳实践来识别这些闲置的参与者

    参与者的
    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规则释放的:当一个参与者不再被引用而成为垃圾时。