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

问题描述

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

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还使用一个日记表。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...