scala - 通过持久性ID查找actor

标签 scala akka akka-persistence akka-actor

我有一个系统,每个用户都有一个 Actor 。用户很少发送消息,但是当他们发送消息时,他们通常不仅发送一条,而且很少发送。

目前,我有一张 map ,用于存储 persistenceId -> ActorRef .当我收到一个 Actor 的新消息时,我会查看 map ,如果有一个 ActorRef,我就会使用它。如果丢失,我会创建它并将其放入 map 中。当然,我不想同时拥有 2 个相同持久性 actor 的实例。此外,我不想为每条消息创建和销毁参与者,因为恢复可能需要一些时间。

我觉得应该有一些更简洁的方式来“定位或创建”一个 Actor 。类似 actorSystem.getOrCreate(persistenceId, props) .我认为分片可能对我有帮助,但我找不到确切的例子。另外,我知道有 actorSelection ,它有以下缺点:

  • 在太多地方使用它,硬编码路径很难
    维护
  • 使用它发送太多消息,因为它具有性能
    费用

  • 所以基本上问题是,如果我的角色persistenceId 是userId,那么在一个服务中定位持久角色的最佳方法是什么。如果我决定使用分片,那么每个 Actor 将是 1 个分片。这个可以吗?

    最佳答案

    Actor 分片几乎是您所需要的 - 您可以将其视为 Actor 的分布式 map ,而无需其他解决方案。分片负责在幕后召唤 Actor ,您无需自己管理 Actor 。

    val sharding = ClusterSharding(system).start(
        typeName = CustomerActor.shardName,
        entityProps = CustomerActor.props,
        settings = ClusterShardingSettings(system),
        extractEntityId = CustomerActor.extractEntityId,
        extractShardId = CustomerActor.extractShardId)
    }
    

    哪里extractEntityId是一个将消息路由到适当参与者的函数
    val extractEntityId: ShardRegion.ExtractEntityId = {
      case gc: GetCustomer => (gc.customerId, gc)
    }
    

    最后一个例子:
    case class GetCustomer(customerId: String)
    
    sharding ! GetCustomer("customer-id")
    

    更多详情在这里https://doc.akka.io/docs/akka/2.5/cluster-sharding.html

    关于scala - 通过持久性ID查找actor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53192288/

    相关文章:

    scala - 在处理 Akka 中的下一条消息之前等待异步 Future 调用

    scala - Akka HTTP编译错误

    java - 如何序列化 Scala 中的函数?

    scala - Akka-Persistence - 可以将可变状态与 akka PersistentActor 一起使用吗?

    domain-driven-design - 领域事件与事件溯源和 CQRS 的因果关系

    scala - 如何创建独立的电梯网络应用程序?

    scala - 使用 X.par.view 与 X.view.par 构建 Scala 并行 View ?

    scala - 找不到 key 'akka.remote.artery' 的配置设置

    java - Eclipse scala.object 无法解析

    java - scala/java : icon for button with a relative path