gpt4 book ai didi

scala - 通过持久性ID查找actor

转载 作者:行者123 更新时间:2023-12-03 23:53:45 25 4
gpt4 key购买 nike

我有一个系统,每个用户都有一个 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/

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