【问题标题】:Using an actor with persistence for a shopping cart so every visitor will have their own actor使用具有持久性的actor作为购物车,这样每个访问者都会有自己的actor
【发布时间】:2021-01-15 08:25:44
【问题描述】:

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

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

如果是同一个日志/表,它如何为正确的购物车参与者重新加载事件,因为每个访问者/客户都有自己的购物车参与者。

【问题讨论】:

    标签: scala akka akka-persistence


    【解决方案1】:

    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 也使用单个日志表。

    【讨论】:

    • 是的,但是数据存储中不会有这么多“表”吗?最终可能会有数百万个购物车......所以会有数百万个日记帐表? (假设我不清除它们)
    • 对于持久性后端,我知道哪些使用表(例如 JDBC、Cassandra),所有事件都写入一个表。
    猜你喜欢
    • 1970-01-01
    • 2022-11-12
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 2023-02-20
    • 2016-03-07
    • 1970-01-01
    相关资源
    最近更新 更多