微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

对购物车使用具有持久性的演员,这样每个访客都将拥有自己的演员

如何解决对购物车使用具有持久性的演员,这样每个访客都将拥有自己的演员

如果我有一个演员代表购物车:

class ShoppingCartActor extends PersistentActor with ActorLogging {
   override def persistenceId: String = "shopping-cart-actor"

   override def receiveCommand: Receive = ???
   override def receiveRecover: Receive = ???
}

val system = ActorSystem("PersistenceActors")

for(i <- 1 to 100) {
  val carts = system.actorOf(Props[ShoppingCartActor],s"shopping-cart-actor-$i"
}

如果我为电子商务商店的每个访客创建一个新的购物车参与者,那么所有事件消息都将存储在存储引擎的同一日记/表中吗?例如postgres或cassandra

如果日记/表是相同的,那么它将如何为正确的购物车演员重新加载事件,因为每个访客/客户都将拥有自己的购物车演员。

解决方法

persistenceId对于每个PersistentActor应该是唯一的。这就是持久性如何检索每个特定参与者的事件的方式(在postgres或cassandra中,它将存储在其自己的列中)。所以你想要类似的东西

class ShoppingCartActor(cartNum: Int) extends PersistentActor with ActorLogging {
  override def persistenceId: String = s"shopping-cart:$cartNum"

  override def receiveCommand: Receive = ???
  override def receiveRecover: Receive = ???
}

object ShoppingCartActor {
  def props(cartId: String): Props[ShoppingCartActor] =
    Props(new ShoppingCartActor(cartId))
}

然后:

val system = ActorSystem(???)

val carts = (1 to 100).map { cartNum =>
  cartNum -> system.actorOf(ShoppingCartActor.props(cartNum),s"shopping-cart-actor-$i")
}.toMap

编辑以澄清:

事件日志的Postgres模式为:

CREATE TABLE IF NOT EXISTS journal (
  ordering BIGSERIAL,persistence_id VARCHAR(255) NOT NULL,sequence_number BIGINT NOT NULL,deleted BOOLEAN DEFAULT FALSE NOT NULL,tags VARCHAR(255) DEFAULT NULL,message BYTEA NOT NULL,PRIMARY KEY(persistence_id,sequence_number)
)

即每个事件都是日志表中的一行,其对应于persistenceId的列。 Akka Persistence Cassandra还使用一个日记表。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。